常用正则表达式

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

0、正则表达式的文档。

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

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

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

141130303.jpg

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

(1)、用re.findall。

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

(2)、用re.search。

>>> content = '''abc"def"ghi'''
>>> re.search(r'"(.+)"', content).group(0)
'"def"'

2、提取双引号之间的内容。规则: (pattern)

(1)、用re.findall。

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

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

(2)、用re.search。

>>> content = '''abc"def"ghi'''
>>> re.search(r'"(.+)"', content).group(1)
'def'

3、效果同2。规则: (?<=pattern)(?=pattern)

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

4、C++中三种正则表达式比较(C regex,C ++regex,boost regex)。

5、查找以某些字符串打头的行。比如查找以+++、---、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)

6、包含/不包含(参考:利用正则表达式排除特定字符串)

(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'^.*?(?<!com)$', text, re.M)
['www.sina.com.cn', 'www.educ.org', 'www.hao.cc', '', 'sina.com.cn', 'educ.org', 'hao.cc']

(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']

7、利用分组得到网址的第一级,即去除后面几级。(匹配全部,去除部分)

方法一:

>>> 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'

8、两个有助于理解正则分组的例子。

(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'

9、提取含有hello字符串的div。

>>> content
'<div id="abc"><div id="hello1"><div id="def"><div id="hello2"><div id="hij">'
>>> 
>>> p = r'<div((?!div).)+hello.+?>'
>>> re.search(p, content).group()
'<div id="hello1">'
>>> re.findall(p, content)
['"', '"']
>>> for iter in re.finditer(p, content):
	print(iter.group())

<div id="hello1">
<div id="hello2">
>>> 
>>> p = r'<div[^>]+hello.+?>'
>>> re.search(p, content).group()
'<div id="hello1">'
>>> re.findall(p, content)
['<div id="hello1">', '<div id="hello2">']
>>> for iter in re.finditer(p, content):
	print(iter.group())

<div id="hello1">
<div id="hello2">

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


*** walker * Updated 2014-12-09 ***


你可能感兴趣的:(python,正则表达式,RegExp)