正则表达式

Published Fri 21 August 2015 in 工具折腾

by HanXiao  


正则基础

常用符号

比较常用的是:

  • ?, 代表前面的字符能出现 0 次或 1 次, 比如 colou?r 表示在目标串中找到 colorcolour 并返回, 即 u 可以出现 0 次或 1 次
  • *, 代表前面的字符能出现 0 次或无限次, 比如 colou*r 表示在目标串中找到 colorcolourcolouurcolouuur 等并返回, 即 u 可以出现 0 次或无限次
  • +, 代表前面的字符能出现 1 次或无限次, 比如 colou+r 表示在目标串中找到 colourcolouurcolouuur 等并返回, 即 u 可以出现 1 次或无限次
  • (), 代表以正则表达式匹配到目标后只返回括起来的内容, 比如 (colou*)r, 其匹配规则与 colou*r 一致, 但只返回 colocoloucolouu

这里准备了一张表(来自小甲鱼), 列出了正则表达式中常用的符号, 有需要注意的地方将在表下方说明.

贪婪? 非贪婪?

? 还有个作用是让匹配模式变为非贪婪匹配. 什么是贪婪? 非贪婪?

如:

String str = "abcaxc";
Patter p = "ab*c";
  • 贪婪匹配: 趋向于最大长度匹配. 如上面使用模式 p 匹配字符串 str, 结果就是匹配到: abcaxc (ab*c).
  • 非贪婪匹配: 趋向于最长度匹配. 如上面使用模式 p 匹配字符串 str, 结果就是匹配到: abc (ab*c).

默认情况下, *+? 都是贪婪匹配, 在后面加上 ? 后, 即: *?+??? 为非贪婪匹配.

(x*?)、 (x*)、 x*?、 x*

表达式中的 x 表示可以用 .\d\w 等符号代替, 表示要匹配的内容:

  • (x*), 表示贪婪式匹配 x, 例如以'(.*)r'能从'colorcolorcolor'匹配到 'colorcolorcolo'
  • x*, 表示贪婪式匹配 x, 例如以'.*r'能从'colorcolorcolor'匹配到 'colorcolorcolor'
  • (x*?), 表示非贪婪式匹配 x, 例如以'(.*?)r'能从'colorcolorcolor'匹配到 ['colo', 'colo', 'colo']
  • x*?, 表示非贪婪式匹配 x, 例如以'.*?r'能从'colorcolorcolor'匹配到 ['color', 'color', 'color']

ptyhon

python 中支持正则表达式的模块是 re, 使用时 import re 即可.

  • search: 匹配第一个符合规律的内容, 返回一个正则表达式对象
  • match: 只有当开头就能匹配到模式的时候, 才返回一个正则表达式对象
  • findall: 匹配所有符合规律的内容, 返回包含结果的列表
  • sub: 替换符合规律的内容, 返回替换后的值

searchmatch 返回的是一个正则表达式对象, 需要通过 group(index) 去获取内容, index 与正则表达式中使用的 ( ) 有关:

index 指出获取正则表达式中第几个括号的返回结果, 0 (或者省略 index) 表示获取无括号的结果, 即 (x*?)x*? 通过 group(0) 返回的结果是一样的, 如果 index 大于括号的数量则会报错;

比如 r = re.match(r'(.*?)r(.*?)r', 'xxxryyyr'):

  • r.group() 返回 xxxryyyr
  • r.group(1) 返回 xxx
  • r.group(2) 返回 yyy