5.3看起来像那样的东西
1.正则表达式
正则表达式(Regular Expression)的主要功能是从字符串(string)中通过特定的模式,搜索希望找到的内容。比如说找到小说中的所有人名,再比如说想找到字符串中 包含的数字。这种格式化的搜索可以写成正则表达式。
Python中可以使用包re来处理正则表达式。下面是一个简单的应用,目的是找到字符串中的数字:
import re m = re.search("[0-9]","abc4def") print(m.group(0)) ______ 4
re.search()接收两个参数,第一个参数"[0-9]"就是正则表达式,它告诉Python“从字符串中找从0到9的任意一个数字字符”。
re.search()如果从第二个参数中找到符合要求的子字符串,就返回一个对象m,可以通过m.group()的方法查看搜索到的结果。如果没有找到符合要求的字符,则re.search()会返回None。
除了 search()方法外,re包还提供了其他搜索方法,它们的功能有所差别:
m = re.search(pattern, string) #搜索整个字符串,直到发现符合的子字符串
m = re.match(pattern, string) #从头开始检查字符串是否符合正则表达式。
#必须从字符串的第一个字符开始就相符
上面的例子中,如果使用re.match()的话,则会得到None,因为字符串的起始为"a",不符合 "[0-9]"的要求。
result = re.match(r'abc', input) # Check for substring 'abc' result = re.match(r'^\w+$', input) # Ensure string is one word pattern = re.compile('abc') # Same as first example result = pattern.match(input)
下面的sub()利用正则pattern在字符串string中进行搜索。对于搜索到的字符串,用另一个字符串replacement进行替换。
# result = re.sub('abc', '', input) # Delete pattern abc
# result = re.sub('abc', 'def', input) # Replace pattern abc -> def
# result = re.sub(r'\s+', ' ', input) # Eliminate duplicate whitespaces using wildcards
# result = re.sub('abc(def)ghi', r'\1', input) # Replace a string with a part of itself
import re result = re.sub(r'\s+',' ',input('请输入文本:')) print('消除重复空格:'+result) ————————————- 请输入文本:阿萨德讲 收到 属性 123 错11·· 消除重复空格: 收到 属性 123 错11·· #自己选了一个办公很有用的例子:)
re. split() #根据正则表达式分割字符串,将分割后的所有子字符串#放在一个表(list)中返回
>>> 'Fri Nov 2 21:40:09 CET 2018'.split() ['Fri', 'Nov', '2', '21:40:09', 'CET', '2018'] >>> 'Fri Nov 2 21:40:09 CET 2018'.split(' ') ['Fri', 'Nov', '', '2', '21:40:09', 'CET', '2018'] <--- Note the extra empty string! >>> 'a,b,c'.split(',', 1) ['a', 'b,c']
re.findall() #根据正则表达式搜索字符串,将所有符合条件的子字符串 #放在一个表(list)中返回:
栗子来自:这里
import re ## Suppose we have a text with many email addresses str = 'purple alice@google.com, blah monkey bob@abc.com blah dishwasher' ## Here re.findall() returns a list of all the found email strings emails = re.findall(r'[\w\.-]+@[\w\.-]+', str) ## ['alice@google.com', 'bob@abc.com'] for email in emails: # do something with each found email string print(email)
2. 写一个正则表达式
正则表达式的常用语法,用某些符号代表单个字符:
.
#任意的一个字符
a | b
#字符a或字符b
[afg]
# a或者f或者g的一个字符
[0-4]
# 0-4范围内的一个字符
[a-f]
# a-f范围内的一个字符
[^m]
\s
\s
\d
#不是m的一个字符
- 一个空格
- 一个非空格
- 一个数字,相当于[0-9]
\D
\w
# 一个非数字,相当于[A0-9]
#数字或字母,相当于[0-9a-zA-Z]
\w
#非数字非字母,相当于[A0-9a-zA-Z]
正则表达式还可以用某些符号来表示某种形式的重复,这些符号紧跟在单个字符之后,就表示多个这样类似的字符:
*
#重复超过0次或更多次
+
#重复1次或超过1次
?
#重复0次或1次
{m}
(m, n}
#重复m次。比如,a{4}相当于aaaa,再比如,[1-3]{2}相当于[1-3][1-3]
#重复m到n次。a{2, 5}表示a重复2到5次,#小于m次的重复或大于n次的重复都不符合条件。
测试:菜鸟正则表达式在线测试
3.进一步提取
有的时候,我们想在搜索的同时,对结果进一步提炼。
比如从下面一个字符串中提取信息:
content = "abcd_output_1994_abcd_1912_abcd"
如果我们把正则表达式写成:
"output_\d{4}"
用search()方法可以找至"output_1994”,提取出1994本身可以在正则表达式上给目标加上括号:
"output_(\d{4})"
括号()包围了一个小的正则表达式\d{4}。这个小的正则表达式能从结果中进一步筛选信息,即四位的阿拉伯数字。用括号()圈起来的正则表达式的一部分,称为群(group)。一个正则表达式中可以有多个群,可以用group(number)的方法来查询群。需要注意的是,group(0) 是整个正则表达的搜索结果。group(1)是第一个群,以此类推:
import re content="abcd_output_1994_abcd_1912_abcd" m=re.search("output_(\d{4})","output_1986txt") print(m.group(1)) ———————————————— 1986
我们还可以将群命名,以便更好地使用group查询:
import re content="abcd_output_1994_abcd_1912_abcd" m=re.search("output_(?P<year>\d{4})","output_1986txt") print(m.group("year")) _____ 1986
上面的(?P<year>...)括住了一个群,并把它命名为year。用这种方式来产生群,就可以通过”year”这个键来提取结果。