分享一个练习正则表达式(数据处理会用到)的网站:regexone. com
正则表达式
与或非:
满足A且满足B(与):(?=PatternA)PatternB
满足A但不满足B:(?!PatternB)PatternA
满足A或满足B(或):(PatternA|PatternB)
分组:
正则里一对括号()表示一个分组,
Match
object—match[0]是regex所代表的整个字符串,match[1]是第一个()中的内容,match[2]是第二对()中的内容。]
match
匹配string 开头,成功返回Match object, 失败返回None,只匹配一个。
search
在string中进行搜索,成功返回Match object, 失败返回None, 只匹配一个。
findall
在string中查找所有
匹配成功的组, 即用括号括起来的部分。返回list对象,每个list item是由每个匹配的所有组组成的list。
finditer
在string中查找所有
匹配成功的字符串, 返回iterator,每个item是一个Match
object。
content =
‘333STR1666STR299’
regex =
r’([A-Z]+(\d))’
1.match =
re.search(regex, content)
print(match.group(0),
match.group(1), match.group(2))
输出:STR1 STR1 1
2.result1 =
re.findall(regex, content)
for m in result1:
print(m[0], m[1])
输出:STR1 1 STR2 2
3.result2 =
re.finditer(regex, content)
for m in result2:
print(m.group(0), m.group(1), m.group(2))
输出:STR1 STR1 1
STR2 STR2 2
把regex最外边的括号去掉,regex = r’[A-Z]+(\d)’,组的个数就会减少一个
推荐命名分组(?P
零宽断言:
用于查找特定内容之前或之后的内容,但并不包括特定内容本身。
对于零宽断言来说,我认为最重要的一个概念是位置,零宽断言用于指定一个位置,这个位置应该满足一定的条件(它附近满足什么表达式),并且这个位置不是字符(因此匹配返回无结果),仅仅是一个位置,因此它们也被称为零宽断言
零宽断言重点的这一个位置,是通过一个条件:这个位置附近(前或者后)存在或者不存在一个A(A可以是一个表达式但不限于)来决定的。
公式 用法举例
(?=exp)
:此位置后面匹配表达式exp test_string
= “2019-07-08,肺癌术后,肿瘤复发,肺癌累及支气管,术后情况良好”result = re.findall(“(肺癌)(?=术后)”,
test_string)
匹配【肺癌】,且在【肺癌】后有【术后】,所以匹配的是第一个肺癌
(?<=exp):此位置前面匹配表达式exp test_string =
“2019-07-08,肺癌术后,肿瘤复发,肺癌累及支气管,术后情况良好”result = re.findall(“(?<=肺癌)(术后)”,
test_string)
匹配【术后】,且在【术后】之前有【肺癌】,所以匹配的是第一个术后。
(?!exp):此位置后面不匹配表达式exp test_string
= “2019-07-08,肺癌术后,肿瘤复发,肺癌累及支气管,术后情况良好”result = re.findall(“(肺癌)(?!术后)”,
test_string)
匹配【肺癌】,且在【肺癌】之后不匹配术后,所以匹配到第二个肺癌
(?<!exp):此位置前面不匹配表达式exp test_string
= “2019-07-08,肺癌术后,肿瘤复发,肺癌累及支气管,术后情况良好”result = re.findall(“(?<!肺癌)(术后)”,
test_string)
匹配【术后】,且在【术后】之前不匹配【肺癌】,所以匹配的是第二个术后。
贪婪和非贪婪 .和.?
定义:非贪婪模式是指在使用正则匹配时,尽可能少的匹配(默认是贪婪模式,即:尽可能多的匹配)。
举例:
test_string
= “较大病灶位于右肺下叶,大小约1087mm,小病灶位于右肺上叶,大小约533mm”
默认情况(贪婪):
pattern
= re.search(r”大小.mm”, test_string)
print(pattern)
输出:<大小约1087mm,小病灶位于右肺上叶,大小约533mm >
非贪婪:
pattern
= re.search(r”大小.?mm”, test_string)
print(pattern)
输出: <大小约1087mm>
后向引用:
用于引用前面分组的内容,简化正则表达式
后向引用,引用的仅仅是匹配成功后的内容,而不是正则表达式
<(title)>.*</\1>可以匹配
