云学python (第5章对象带你飞之正则表达式)《vamei-从Python开始学编程》 笔记

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从字符串中找从09的任意一个数字字符”。

re.search()如果从第二个参数中找到符合要求的子字符串,就返回一个对象m可以通过m.group()的方法查看搜索到的结果。如果没有找到符合要求的字符,则re.search()会返回None。

除了 search()方法外,re包还提供了其他搜索方法,它们的功能有所差别:

re.search(pattern, string) #搜索整个字符串,直到发现符合的子字符串

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进行替换。

simple examples

# 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. 写一个正则表达式

正则表达式的常用语法,用某些符号代表单个字符:

.

#任意的一个字符

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]

#重复mn次。a{2, 5}表示a重复25次,#小于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”这个键来提取结果。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值