正则表达式

上一篇 / 下一篇  2017-10-04 20:56:44 / 个人分类:python

什么是正则表达式:

用某种字符串表达式制定了一个规则,可以实现字符串的模糊匹配

 

标准的正则表达式:

linux shell egrep

java perl python 都有正则表达式的。

 

正则表达式用途:

1分析日志,统计

2数据处理,替换、数据提取、删除等

3过滤敏感词

 

正则表达式的包:re

>>> import re

>>> pattern=re.compile(r"\d+")

 

正则表达式的内容:r"\d+"  \d表示数字  +表示匹配1个或多个

编译正则表达式:re.compile(r"\d+")---》生成了一个名称叫做pattern的正则表达式对象<_sre.SRE_Pattern object。。。

 

用正则表达式去匹配"123abc"字符串的开头是否有一个或多个数字

pattern.match("123abc")--》如果匹配到了,则会把匹配到的内容存入变量里

我们可以调用,如:print pattern.match("123abc").group()匹配的内容是123

如果没有匹配到,print pattern.match("abc"),则打印None

print pattern.match("abc").group(),则报错:

AttributeError: 'NoneType' object has no attribute 'group'

 

>>> pattern.pattern   #返回匹配的正则表达式

'\\d+'

>>> pattern.search("27hjdjh3434f3")   #扫描整个字符串但 返回第一个匹配到的

<_sre.SRE_Match object at 0x0000000002DBA510>

>>> pattern.search("kj45j848954").group()

'45'

\w表示匹配:A-Za-z0-9_  \W表示匹配非A-Za-z0-9_的内容

>>> re.match(r"\w","_dsf")   #开头匹配一个数字或者字母

<_sre.SRE_Match object at 0x0000000002DBA510>

>>> re.match(r"\w","_dsf").group()

'_'

>>> re.match(r"\w+","_?ds23782>f").group() #开头匹配一个或者多个数字或者字母

'_'

>>> re.match(r"\w+","_ds23782>f").group()

'_ds23782'

>>> re.match(r"\W+","_ds23782>f").group()  #开头匹配一个非数字或者字母

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

AttributeError: 'NoneType' object has no attribute 'group'

>>> re.match(r"\W+",">?">f").group()   #字符写的有问题

  File "<stdin>", line 1

    re.match(r"\W+",">?">f").group()

                                   ^

SyntaxError: EOL while scanning string literal

>>> re.match(r"\W+",">?>f").group()

'>?>'

\D匹配非数字

>>> a=re.compile(r"\D+")  #\D匹配非数字

>>> a.match("34zhang")

>>> a.match("zh34ang")

<_sre.SRE_Match object at 0x000000000336A4A8>

>>> a.match("zh34ang").group()

'zh'

>>> a.match("GAH!.23")

<_sre.SRE_Match object at 0x0000000002DBA510>

>>> a.match("GAH!.23").group()

'GAH!.'

>>> if a.match("1.asf"):

...     print "match something"

... else:

...     print "no match"

...

no match

>>> print a.match("jka232").group()

jka

>>>

 

searchmatch的区别:

search是从全部字符串中查找,返回第一个匹配到的信息,如果都没有匹配的话就报错

match是在字符串的开头查找,找到了返回,没找到的报错

\s\d\w表示只能匹配一个字符

\s+表示匹配一个或多个空白字符

\r表示回车符号

\n表示换行符

 

\s表示匹配空白:空格、\t\r\n\f\S表示匹配非空白的内容

>>> re.match(r"\s","   f").group()

' '

>>> re.match(r"\S","   f").group()

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

AttributeError: 'NoneType' object has no attribute 'group'

>>> re.match(r"\S","1   f").group()

'1'

>>>

findall表示获取所有的正则表达式匹配的字符串,并存入一个list

re.findall(r"\d+","a1b2c3")-----[1,2,3]

>>> re.findall(r"\d+","ff232ksk44")

['232', '44']

.表示匹配任意的一个字符,除了\n

>>> re.match(r"a.c","abc").group()  #匹配ac之间有一个任意字符

'abc'

>>> re.match(r"a.c","axc").group()

'axc'

>>> re.match(r"a.c","a5c").group()

'a5c'

>>> re.match(r"a.c","a\nc").group() #.不能匹配\n

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

AttributeError: 'NoneType' object has no attribute 'group'

>>>

>>> re.match(r"a.v","anvf").group()

'anv'

>>> re.match(r"a.v","a_vf").group()

'a_v'

>>> re.match(r"a+.v","a_vf").group()

'a_v'

*表示匹配0个或多个字符

>>> re.match(r"ab*c","ac")   #表示匹配ac之间有零或者多个

r"ab*c"表示:一定要有ac,且ac之间可以有0个或多个b,且不能有任何一个其他字符

<_sre.SRE_Match object at 0x0000000002DBA510>

>>> re.match(r"ab*c","ac").group()

'ac'

>>> re.match(r"ab*c","abbbbbbc").group()

'abbbbbbc'

>>> re.match(r"ab*c","abbbbfbbc").group()

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

AttributeError: 'NoneType' object has no attribute 'group'

>>> re.match(r"ab\*c","ab*c").group()   #匹配*

'ab*c'

+表示连续匹配一个或多个字符

{2}表示匹配2个,{1,3}表示匹配1个至3个都可以

>>> re.match(r"a{2}c","aac").group()  #表示匹配开头有两个a和一个b

'aac'

>>> re.match(r"a{2}c","ac").group()

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

AttributeError: 'NoneType' object has no attribute 'group'

>>> re.match(r"a{2}c","aaac").group()

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

AttributeError: 'NoneType' object has no attribute 'group'

>>> re.match(r"a{1,3}c","aaac").group()   #表示匹配开头a有一到三个之间加一个c

'aaac'

>>> re.match(r"a{1,3}c","aac").group()

'aac'

>>> re.match(r"a{1,3}c","ac").group()

'ac'

.+表示匹配一个或多个字符

>>> re.match(r"a.+v","a_jhvfggvjjkvf").group()   #取最长的符合条件的,贪婪性,不贪婪的要加?

'a_jhvfggvjjkv'

>>>

 

练习:英文一个句子,用正则表达式统计一下有几个单词?

>>> s="it is a dog"
>>> a=re.findall(r"\w+",s)
>>> a
['it', 'is', 'a', 'dog']
>>> len(a)
4


TAG:

 

评分:0

我来说两句

我的栏目

日历

« 2024-03-27  
     12
3456789
10111213141516
17181920212223
24252627282930
31      

数据统计

  • 访问量: 14028
  • 日志数: 20
  • 建立时间: 2016-10-19
  • 更新时间: 2018-01-27

RSS订阅

Open Toolbar