3.正则表达式使用基础:括号(一)

2019-08-20  本文已影响0人  BoatingTao

3.1分组

15位:[1-9]\d{14}
18位:[1-9]\d{14}\d{2}[0-9x]
re.search(r"^ab+$","ab") != None   #=> True
re.search(r"^ab+$","abb") != None   #=> True
re.search(r"^ab+$","abab") != None   #=> False

re.search(r"^(ab)+$","ab") != None   #=> True
re.search(r"^(ab)+$","abb") != None   #=> False
re.search(r"^(ab)+$","abab") != None   #=> True

有了分组,就可以准确表示“长度只能是m或者n”

3.2多选分组

之前用表达式[1-9]\d{14}(\d{2}[09-x])?匹配身份证号,思路是把18位号码多出的3位“合并”到匹配的15位号码的表达式中。还可以有其他方式。
15位身份证号就是[1-9]开头,之后是14位数字;18位身份证的开头也是[1-9]的数字,之后是16位数字,最后是[1-9x]?。只需要匹配两种表达式中的一个,就是合法身份证。那我们可以使用多选分组。

(\d|\d{2}|1\d\d|2[0-4]\d|25[0-5])

-关于多选分组,补充三点:
1.多选结构的一般表示法是(option1|option2),在多选结构中一般会同时使用()和竖线 |;但是如果没有括号,只出现竖线|,仍然是多选结构。

re.search(r"ab|cd","ab") != None  # =>True
re.search(r"ab|cd","cd") != None # =>True

括号的用来规定整个多选结构的范围,如果没有出现括号,则整个表达式视为一个多选结构,所以 ab|cd 等价于 (ab|cd),建议多选结构都写出括号。

print(re.search(r"(jeffery|jeff)", "jeffery")).group(0)
jeffery

print(re.search(r"(jeff|jeffery)", "jeffery")).group(0)
jeff

最好避免出现相同字符的多选结构,这样匹配会造成大量回溯,影响效率。

3.3引用分组

result = re.search(r"(\d{4})-(\d{2})-(\d{2})"), "2010-12-22")
print(result .group(1))
2010

print(result .group(2))
12

print(result .group(3))
22

print(result .group(0))
2010-12-22

print(result .group())
2010-12-22

括号还可以嵌套,例如下面的例子,这种比较繁冗。分组的编号此时根据开括号的出现顺序来计数

manyGroups = r"(((\d{4})-(\d{2}))-(\d{2}))"
result = re.search(manyGroups, "2010-12-22")

print(result.group(0))
2010-12-22

print(result.group(1))
2010-12-22

print(result.group(2))
2010-12

print(result.group(3))
2010

print(result.group(4))
12

print(result.group(5))
22

3.3正则表达式替换

print(re.sub(r"[a-z]", " ","1a2b3c"))
1 2 3
上述代码是将字符串1a2b3c中的英文字母替换为一个空格
上一篇 下一篇

猜你喜欢

热点阅读