python re正则表达式

image.png
    1. Pattern对象
pattern = re.compile(r'\d', flags=0)

通过Pattern对象调用re的匹配方法re.xxx匹配方法(Pattren, string, flag)

source_srt = 'sss12ssss'
# 通过re.compile生成pattern对象
pattern = re.compile(r'\d', flags=0)
matchObj1 = pattern.search(source_srt)
print('--->1 ', matchObj1)  # --->1  <re.Match object; span=(3, 4), match='1'>

matchObj2 = re.search(r'\d', source_srt, flags=0)
print('--->2 ', matchObj2)  # --->2  <re.Match object; span=(3, 4), match='1'>

匹配到了,返回 MatchObject(True)
没有匹配到,返回None(False)


  • 2.分组
    MatchObject调用group #默认为0,表示匹配整个字符串
pattern_group = r'www\.(.*)\..{3}'
matchObj3 = re.match(pattern_group, 'www.dxy.com')
print('matchObj3.group()->', matchObj3.group())       # matchObj3.group()-> www.dxy.com
print('matchObj3.group(1)->', matchObj3.group(1))   # matchObj3.group(1)-> dxy


    1. \数组分组
# 返回通过用替换repl替换字符串中最左边的不重叠模式所获得的字符串。如果找不到该模式, 则返回的字符串不变
# re.subn(pattern, repl, string, count=0, flags=0)
re.sub('\d', 'K', 'abc12jh45li78')  # 将匹配到的数字替换成K  abcKKjhKKliKK
re.sub('\d', 'K', 'abc12jh45li78', 2)  # 将匹配到的数字替换成K,替换2个  abcKKjh45li78


  • 4.re.findall 详解
import re

string="abcdefg  acbdgef  abcdgfe  cadbgfe"

#带括号与不带括号的区别
#不带括号
regex=re.compile("((\w+)\s+\w+)")
print(regex.findall(string))
#输出:[('abcdefg  acbdgef', 'abcdefg'), ('abcdgfe  cadbgfe', 'abcdgfe')]

regex1=re.compile("(\w+)\s+\w+")
print(regex1.findall(string))
#输出:['abcdefg', 'abcdgfe']

regex2=re.compile("\w+\s+\w+")
print(regex2.findall(string))
#输出:['abcdefg  acbdgef', 'abcdgfe  cadbgfe']

第一个 regex 中是带有2个括号的,我们可以看到其输出是一个list 中包含2个 tuple
第二个 regex 中带有1个括号,其输出的内容就是括号匹配到的内容,而不是整个表达式所匹配到的结果。
第三个 regex 中不带有括号,其输出的内容就是整个表达式所匹配到的内容。

结论:findall()返回的是括号所匹配到的结果(如regex1),多个括号就会返回多个括号分别匹配到的结果(如regex),如果没有括号就返回就返回整条语句所匹配到的结果(如regex2)。所以在提取数据的时候就需要注意这个坑。

实际上是由其并不是python特有的,这是 正则 所特有的 , 任何一门高级语言使用正则都满足这个特点:有括号时只能匹配到括号中的内容,没有括号【相当于在最外层增加了一个括号】。在正则里面 “()” 代表的是分组的意思,一个括号代表一个分组,你只能匹配到"()"中的内容

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容