分享一个练习正则表达式(数据处理会用到)的网站: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)’,组的个数就会减少一个
    推荐命名分组(?Pgroup),例如(?P\d{4})

    零宽断言:
    用于查找特定内容之前或之后的内容,但并不包括特定内容本身。
    对于零宽断言来说,我认为最重要的一个概念是位置,零宽断言用于指定一个位置,这个位置应该满足一定的条件(它附近满足什么表达式),并且这个位置不是字符(因此匹配返回无结果),仅仅是一个位置,因此它们也被称为零宽断言
    零宽断言重点的这一个位置,是通过一个条件:这个位置附近(前或者后)存在或者不存在一个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)
    输出:<大小约10
    87mm,小病灶位于右肺上叶,大小约533mm >
    非贪婪:
    pattern = re.search(r”大小.
    ?mm”, test_string)
    print(pattern)
    输出: <大小约1087mm>

    后向引用:
    用于引用前面分组的内容,简化正则表达式
    后向引用,引用的仅仅是匹配成功后的内容,而不是正则表达式
    <(title)>.*</\1>可以匹配