7.1 首先导入re模块,import re,然后利用re.compile()方法创建Regex对象
7.2 在创建Regex对象时,正则表达式中有很多字符串表达的并不是表面上的含义,如'\d',在正则表达式中代表的是一个任意的数字。为了表达其表面上的含义,必须在前面加上''来进行转译。但是,通过在字符串的第一个引号之前加上r,可以将该字符串标记为原始字符串,它不包括转义字符。
7.3 Regex.search()方法返回的是Match对象
7.4 对Match对象采用Match.group()方法来得到匹配的字符串。group()方法中Match.group()和Match.group(0)都表示第一个匹配的完整的字符串。
7.5 group(0)表示第一个匹配的完整的字符串,group(1)表示匹配(\d\d\d)的字符串,group(2)表示匹配(\d\d\d\d)的字符串。
7.6 利用转译符,()和.来表示圆括号和句号。
7.7 正则表达式中采用了用圆括号分组,那么findall()方法就会返回由元组构成的列表,且只返回圆括号内分组的部分;否则,将返回由字符串构成的列表。
7.8 |是管道符,代表’或‘的意思。
7.9 ?一,表示其前面的分组匹配0或1次;二,表示非贪心模式。
7.10 ’+‘表示至少匹配一次;’*‘表示可以不匹配,也可以匹配多次。
7.11 {3}表示匹配3次,{3, 5}表示最少匹配3次,最多匹配5次,且此处是贪心模式,尽量匹配更多的次数。
7.12 \d表示0-9的任一数字,\w表示任一字母,\s表示一个空格。
7.13 \D表示0-9以外的任一字符,\W表示除字母外的任一字符,\S表示除空格外的任一字符。
7.14 向re.compile()传入re.IGNORECASE或re.I作为第二个参数,让匹配不区分大小写。
7.15 句号匹配的是任一除换行符之外的字符。向re.compile()传入re.DOTALL后意味着句号可以匹配任一字符,包括换行符。
7.16 .*可以匹配任意字符,.*?是其贪心模式。
7.17 [a-z0-9]
7.18 X drummers, X pipers, five rings, X hens
7.19 re.VERBOSE作为re.compile()方法的第二参数,可以忽略正则表达式中的空格和注释。
7.20 如果只是匹配‘42’,‘4,123’而不匹配‘12,34,567’,‘1234’。正则表达式为(r'^\d{1,3}(,\d{3})*$'),可以很好的匹配。
如果想要从一段文字中将以每三位数用逗号隔开这种形式的数字筛选出来,下面是尝试写的代码,如果有bug或者更为简洁的代码,欢迎留言!
import re
text = '42sdf1,234ds6,368,745ds12,34,567sdfs1234'
matches = []
# the regex of numbers
findNumRegex = re.compile(r'\d+,[\d,]+|\d+')
#Put all numbers in a list.
numberList = findNumRegex.findall(text)
# The regex of a number with commas for every three digits.
numRegex = re.compile(r'^\d{1,3}(,\d{3})*)
# Find all right numbers.
for number in numberList:
mo = numRegex.search(str(number))
try:
matches.append(mo.group())
except:
pass
print(matches)
7.21 re.compile(r'[A-Z]\w+\sNakamoto')可以很好的匹配。
7.22
re.compile(r'''(Alice|Bob|Carol) # people name
\s # white space
(eats|pets|throws) # motion
\s # white space
(apples|cats|baseballs) # things
\.$ # period
''', re.VERBOSE|re.I)
可以很好的匹配。