python re正则表达式(简单概述)

re:regular expression operations(正则表达式)

这个模块提供了正则表达式类似于Perl。
不管是模式还是被搜索的字符串可以是Unicode字符串(str)也是8位的字符串(bytes).然而Unicode和bytes不能被混合:那就是,你不能去匹配的Unicode字符串通过一个字节模式,反而亦然。当要求代替,替换字符串必须与模式和搜索字符串具有相同的类型。
一种解决方法就是使用python的r’xxx’即使用raw,原始字符串。通常模式会使用原始字符串来表示。

正则表达式使用反斜杆\去指定一种特殊形式或者允许特殊符号不使用特殊含义。
需要注意的是,大多数正则表达式操作都可以作为模块级函数和方法来使用。这些函数是一些快捷方式,不需要您首先编译regex对象,但是会错过一些微调参数。
也看一下: 第三方的regex模块,有一个兼容re库模块API,但提供了额外的函数和更广泛的Unicode支持。

正则表达式语法

一个正则表达式特指一种匹配它的字符串的集合。这个模块的函数让你检测是否有特殊的字符串匹配一个给定的正则表达式(或者如果一个给定的正则表达式匹配了一个特殊的字符串,归根到底是一样的东西)

正则表达式能够被串联起来去组成一个新的正则表达式;如果A和B都是正则表达式,然后AB也是一个正则表达式。大体上,如果字符串p匹配A并且另一个字符串q匹配B,那么pq能够匹配AB。

一些特殊符号

  • (.) 任何字符 在默认模式下,这能够匹配任何字符除了换行。
  • (^) 开头 匹配字符串开头,然后再多行模式下,每个换行后立即匹配。
  • ( ) ∗ ∗ 结 尾 ∗ ∗ 匹 配 字 符 串 的 末 尾 或 字 符 串 末 尾 的 换 行 之 前 , 在 多 行 模 式 下 也 匹 配 换 行 之 前 。 f o o 同 时 匹 配 ′ f o o ′ 和 ′ f o o b a r ′ , 而 正 则 表 达 式 f o o ) **结尾** 匹配字符串的末尾或字符串末尾的换行之前,在多行模式下也匹配换行之前。foo同时匹配' foo '和' foobar ',而正则表达式foo )foofoofoobarfoo只匹配’ foo '。更有趣的是,搜索foo。$ in ‘foo1\nfoo2\n’通常匹配’ foo2 ',但’foo1 '在多行模式;在’foo\n’中搜索单个$将发现两个(空的)匹配项:一个在换行之前,一个在字符串末尾。
  • (*) 匹配前面0-n个字符。
  • (+) 匹配前面1-n个字符。
  • (?) 匹配前面0-1个字符,如ab? 匹配’a’ 或者 ‘ab’
  • (?,+?,??) “”、“+”和“?”“限定词都是贪婪的;它们匹配尽可能多的文本。有时这种行为是不受欢迎的;如果RE <。>与’ b ‘匹配,它将匹配整个字符串,而不仅仅是’’。添加?限定符使其以非贪婪或最小方式执行匹配之后;匹配的字符越少越好。使用RE <.?>将只匹配’’。
  • ({m}) 指定数字的n个复制。如a{6}匹配6个字符。
  • {m,n} 指定m-n个复制字符,贪婪匹配
  • {m,n}? 非贪婪匹配
  • (\)或者转义特殊字符(允许您匹配’*’、’?,或者表示一个特殊的序列;下面讨论特殊序列。
    如果没有使用原始字符串来表示模式,请记住Python还使用反斜杠作为字符串字面量中的转义序列;如果Python的解析器不能识别转义序列,则反斜杠和后续字符将包含在结果字符串中。然而,如果Python能够识别结果序列,则反斜杠应该重复两次。这很复杂,很难理解,所以强烈建议您对所有表达式使用原始字符串,但最简单的表达式除外。
  • ([ ]) 用来只是一集合
    • 如[amk]可以匹配’a’,‘m’或者’k’
    • 指定一定范围的字符
    • [(+*)]里面会匹配里面任何特殊符号的原义
    • 字符类如\w或者\S也在集合中可以接受
    • 不在一个范围内的字符可以通过对集合求补来匹配。如果集合的第一个字符是’’,那么集合中所有不在集合内的字符都将被匹配。例如,[5]将匹配除’5’之外的任何字符,[^]将匹配除’'之外的任何字符。^如果不是集合中的第一个字符,就没有特殊的意义。
    • 若要匹配集合内的文字“]”,请在其前面加上反斜杠,或将其放在集合的开头。例如,[()[]{}和[{}]都将匹配括号集合。
  • (|)a|b匹配a或b。如果要匹配| 使用|
  • (…)形成组匹配 使用\匹配其他。
    剩下一些好难好难呀:
    在这里插入图片描述
  • \w 匹配字母数字及下划线
  • \W 匹配非字母数字及下划线
  • \s 匹配任意空白字符,等价于 [\t\n\r\f].
  • \S 匹配任意非空字符
  • \d 匹配任意数字,等价于 [0-9].
  • \D 匹配任意非数字
  • \A 匹配字符串开始
  • \Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。
  • \z 匹配字符串结束
  • \G 匹配最后匹配完成的位置。
  • \b 匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配"never" 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。
  • \B 匹配非单词边界。‘er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。
  • \n, \t, 等. 匹配一个换行符。匹配一个制表符。等
  • \1…\9 匹配第n个分组的内容。
  • \10 匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。

flags : 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:

  • re.I 忽略大小写
  • re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
  • re.M 多行模式
  • re.S 即为 . 并且包括换行符在内的任意字符(. 不包括换行符)
  • re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
  • re.X 为了增加可读性,忽略空格和 # 后面的注释
模块内容:模块定义了几个方法、常量和一个异常。

re.compile(pattern, flags=0) 方法:
可以把一个正则表达式编译成一个正则表达式对象:

prog = re.compile(pattern)
result = prog.match(string)

等价于:

result = re.match(pattern, string)

但是,当表达式在一个程序中多次使用时,使用re.compile()并保存生成的正则表达式对象以便重用会更有效。
注意,传递给re.compile()的最新模式的编译版本和模块级匹配函数被缓存,因此一次只使用几个正则表达式的程序不必担心编译正则表达式。

re.A
re.ASCII:使\w、\w、\b、\b、\d、\d、\s和\s只执行ascii匹配,而不执行完整的Unicode匹配。
re.debug:显示有关已编译表达式的调试信息。没有相应的内联标志。
re.I
re.IGNORECASE
re.L
re.LOCALE
re.M
re.MULTILINE
re.S
re.DOTALL
re.X
re.VERBOS:这个标志允许您通过可视化地分离模式的逻辑部分并添加注释来编写看起来更好、更易于阅读的正则表达式。
search(pattern, string, flags=0)
扫描字符串,寻找正则表达式模式生成匹配的第一个位置,并返回相应的匹配对象。如果字符串中没有与模式匹配的位置,则返回None;注意,这与在字符串中的某个点上找到零长度匹配不同。
re.match(pattern, string, flags=0) (限制版本的search)
如果字符串开头的零个或多个字符与正则表达式模式匹配,则返回相应的匹配对象。如果字符串与模式不匹配,则返回None;注意,这与零长度匹配不同。
注意,即使在多行模式下,re.match()也只匹配字符串的开头,而不是每一行的开头。
如果希望在字符串中的任何位置找到匹配项,请使用search()(也请参阅search()和match())。
re.fullmatch(pattern, string, flags=0)
如果整个字符串匹配正则表达式模式,则返回相应的match对象。如果字符串与模式不匹配,则返回None;注意,这与零长度匹配不同。
re.split(pattern, string, maxsplit=0, flags=0)
按出现的模式拆分字符串。**如果模式中使用捕获括号,那么模式中所有组的文本也将作为结果列表的一部分返回。**如果maxsplit是非零的,则最多执行maxsplit拆分,并将字符串的其余部分作为列表的最后一个元素返回。

>>> re.split(r'\W+', 'Words, words, words.')
['Words', 'words', 'words', '']
>>> re.split(r'(\W+)', 'Words, words, words.')
['Words', ', ', 'words', ', ', 'words', '.', '']
>>> re.split(r'\W+', 'Words, words, words.', 1)
['Words', 'words, words.']
>>> re.split('[a-f]+', '0a3B9', flags=re.IGNORECASE)
['0', '3', '9']

如果分隔符中有捕获组,并且它在字符串的开头匹配,那么结果将以一个空字符串开始。字符串的末尾也是如此:

>>> re.split(r'(\W+)', '...words, words...')
['', '...', 'words', ', ', 'words', '...', ''] 因为匹配了... 在前后分出' '

That way, separator components are always found at the same relative indices within the result list.

Empty matches for the pattern split the string only when not adjacent to a previous empty match.

>>> re.split(r'\b', 'Words, words, words.')
['', 'Words', ', ', 'words', ', ', 'words', '.']
>>> re.split(r'\W*', '...words...')
['', '', 'w', 'o', 'r', 'd', 's', '', '']
>>> re.split(r'(\W*)', '...words...')
['', '...', '', '', 'w', '', 'o', '', 'r', '', 'd', '', 's', '...', '', '', '']

re.findall(pattern, string, flags=0)
返回字符串中模式的所有非重叠匹配,作为字符串列表。从左到右扫描字符串,并按找到的顺序返回匹配项。如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。结果中包含空匹配。
版本3.7中更改:非空匹配现在可以在前一个空匹配之后启动。

re.finditer(pattern, string, flags=0)
返回一个迭代器,为字符串中的RE模式生成所有非重叠匹配的匹配对象。从左到右扫描字符串,并按找到的顺序返回匹配项。结果中包含空匹配。
版本3.7中更改:非空匹配现在可以在前一个空匹配之后启动。

re.sub(pattern, repl, string, count=0, flags=0)

>>> def dashrepl(matchobj):
	if matchobj.group(0)=='-':
		print(matchobj.group(0))
		return ' '
	else:
		print(matchobj.group(0))
		return '-'
		>>> re.sub('-{1,2}',dashrepl,'pro----gram-files')
--
--
-
'pro--gram files'
>>> re.sub(r'\sAND\s', ' & ', 'Baked Beans And Spam', flags=re.IGNORECASE)
'Baked Beans & Spam'

模式可以是字符串或模式对象。

re.subn(pattern, repl, string, count=0, flags=0):
执行跟sub()一样的操作,但返回一个元组(new_string, number_of_subs_made).
re.escape(pattern)
对于模式中的特殊符号,可以使用该函数来有效解决问题。

>>> print(re.escape('python.exe'))
python\.exe

>>> legal_chars = string.ascii_lowercase + string.digits + "!#$%&'*+-.^_`|~:"
>>> print('[%s]+' % re.escape(legal_chars))
[abcdefghijklmnopqrstuvwxyz0123456789!\#\$%\&'\*\+\-\.\^_`\|\~:]+

>>> operators = ['+', '-', '*', '/', '**']
>>> print('|'.join(map(re.escape, sorted(operators, reverse=True))))
/|\-|\+|\*\*|\*

这个函数不能用于sub()和subn()中的替换字符串,只应该转义反斜杠。例如:(不是很懂)

>>> digits_re = r'\d+'
>>> sample = '/usr/sbin/sendmail - 0 errors, 12 warnings'
>>> print(re.sub(digits_re, digits_re.replace('\\', r'\\'), sample))
/usr/sbin/sendmail - \d+ errors, \d+ warnings

re.purge()
清理正则表达式的缓存。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值