下面的例子默认以 python 为实现语言,用到 python 的 re 模块或  regex 库。

  • 正则表达式的文档。

(1)、正则表达式30分钟入门教程

(2)、另一个不错的入门教程。

(3)、揭开正则表达式的神秘面纱,个人觉得这篇文章对Multiline的讲解特别到位,截图如下:

常用正则表达式_第1张图片

  • 提取双引号及之间的内容。

(1)、用re.findall。

text = '''abc"def"ghi'''
re.findall(r'".+"', text)
#结果
['"def"']

(2)、用re.search。

>>> text = '''abc"def"ghi'''
>>> re.search(r'"(.+)"', text).group(0)
'"def"'
  • 提取双引号之间的内容。规则: (pattern)

(1)、用re.findall。

text = '''abc"def"ghi'''
re.findall(r'"(.+)"', text)
#结果
['def']

1的区别是在需要返回的内容两边加上了括号。

(2)、用re.search。

>>> text = '''abc"def"ghi'''
>>> re.search(r'"(.+)"', text).group(1)
'def'
  • 效果同2。规则: (?<=pattern)(?=pattern)

text = '''abc"def"ghi'''
re.findall(r'(?<=").+(?=")', text)
#结果
['def']
  • C++中三种正则表达式比较(C regex,C ++regex,boost regex)。

  • 查找以某些字符串打头的行。比如查找以+++、---、index打头的行:

#方法一,按行匹配
for i in lst:
    if re.match(r"(---|\+\+\+|index).*", i):
        print i
#方法二,一次性匹配
re.findall(r'^(?:\+\+\+|---|index).*$', content, re.M)
#方法二精简版
re.findall(r'^(?:[-\+]{3}|index).*$', content, re.M)
  • 包含/不包含(参考:利用正则表达式排除特定字符串)

(0)、文本内容

>>> print(text)
www.sina.com.cn
www.educ.org
www.hao.cc
www.baidu.com
www.123.com

sina.com.cn
educ.org
hao.cc
baidu.com
123.com

(1)、匹配以www打头的行

>>> re.findall(r'^www.*$', text, re.M)
['www.sina.com.cn', 'www.educ.org', 'www.hao.cc', 'www.baidu.com', 'www.123.com']

(2)、匹配不以www打头的行

>>> re.findall(r'^(?!www).*$', text, re.M)
['', 'sina.com.cn', 'educ.org', 'hao.cc', 'baidu.com', '123.com']

(3)、匹配以cn结尾的行

>>> re.findall(r'^.*?cn$', text, re.M)
['www.sina.com.cn', 'sina.com.cn']

(4)、匹配不以com结尾的行

>>> re.findall(r'^.*?(? 
  

(5)、匹配包含com的行

>>> re.findall(r'^.*?com.*?$', text, re.M)
['www.sina.com.cn', 'www.baidu.com', 'www.123.com', 'sina.com.cn', 'baidu.com', '123.com']

(6)、匹配不包含com的行

>>> re.findall(r'^(?!.*com).*$', text, re.M)
['www.educ.org', 'www.hao.cc', '', 'educ.org', 'hao.cc']

>>> re.findall(r'^(?:(?!com).)*?$', text, re.M)
['www.educ.org', 'www.hao.cc', '', 'educ.org', 'hao.cc']
  • 利用分组得到网址的第一级,即去除后面几级。(匹配全部,去除部分)

方法一:

>>> strr = 'http://www.baidu.com/abc/d.html'
>>> re.findall(r'(http://.+?)/.*', strr)
['http://www.baidu.com']

方法二:

>>> re.sub(r'(http://.+?)/.*', r'\1', strr)
'http://www.baidu.com'
  • 两个有助于理解正则分组的例子。

(1)、

>>> strr = 'A/B/C'
>>> re.sub(r'(.)/(.)/(.)', r'xx', strr)
'xx'
>>> re.sub(r'(.)/(.)/(.)', r'\1xx', strr)
'Axx'
>>> re.sub(r'(.)/(.)/(.)', r'\2xx', strr)
'Bxx'
>>> re.sub(r'(.)/(.)/(.)', r'\3xx', strr)
'Cxx'

(2)、

>>> text = 'AA,BB:222'
>>> re.search(r'(.+),(.+):(\d+)', text).group(0)
'AA,BB:222'
>>> re.search(r'(.+),(.+):(\d+)', text).group(1)
'AA'
>>> re.search(r'(.+),(.+):(\d+)', text).group(2)
'BB'
>>> re.search(r'(.+),(.+):(\d+)', text).group(3)
'222'
  • 提取含有hello字符串的div。

>>> content
''
>>> 
>>> p = r''
>>> re.search(p, content).group()
''
>>> re.findall(p, content)
['"', '"']
>>> for iter in re.finditer(p, content):
	print(iter.group())



>>> 
>>> p = r']+hello.+?>'
>>> re.search(p, content).group()
''
>>> re.findall(p, content)
['', '']
>>> for iter in re.finditer(p, content):
	print(iter.group())


  • 据walker猜测:在python3的Unicode字符集下,\s匹配\f\n\r\t\v加全角半角空格,共7个字符。

  • 如果所使用的工具支持肯定环视(positive lookahead),同时可以在肯定环视中使用捕获括号(capturing parentheses),就能模拟实现固化分组(atomic grouping)和占有优先量词(possessive quantifiers)。

  • 千分位。

(1)、Python

>>> format(23456789, ',')
'23,456,789'
# 利用肯定逆序环视与肯定顺序环视
>>> re.sub(r'(?<=\d)(?=(?:\d{3})+$)', ',', '2345678')
'2,345,678'

(2)、JavaScript

//利用肯定顺序环视(因为js不支持肯定逆序环视)
//结果为"23,456,789"
"23456789".replace(/(\d)(?=(?:\d{3})+$)/g, "$1,")
  • 单层嵌套括号(平衡组)

>>> import re
>>> line = r'盖层(汽油) 塔里木盆地(学科: 盖层(油气) 学科: 评价) 塔里木盆地'
>>> re.findall(r'\([^()]*(\([^()]*\)[^()]*)*\)', line)
['', '(油气) 学科: 评价']
>>> re.findall(r'\([^()]*(?:\([^()]*\)[^()]*)*\)', line)
['(汽油)', '(学科: 盖层(油气) 学科: 评价)']
  • 匹配汉字

>>> regex.findall(r'\p{Han}', '孔子/现代价值/Theory of "Knowing"')
['孔', '子', '现', '代', '价', '值']


【相关阅读】

1、Python中的re.search和re.findall之间的区别和联系

2、正则表达式测试:regex101、regexr。

3、Python的regex模块——更强大的正则表达式引擎

4、桌面工具:RegexBuddy

4.1、demo 版下载:SetupRegexBuddyDemo.exe

4.2、修改注册表:RegexBuddy 4.7.0 x64 评估试用到期,无限试用的办法

5、Unicode 正则


*** walker * Updated 2018-12-01 ***