利用正则表达式查找文本

>>> import re    导入regex包
>>>phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')        #设定一个匹配模式
>>> mo = phoneNumRegex.search('My number is 415-555-4242.')    #这个complie方法调用search查找字符串中符合的部分
>>> print('Phone number found: ' + mo.group())            #查找的结果赋值给mo变量,调用group方法输出
Phone number found: 415-555-42421
1.用 import re 导入正则表达式模块。
2.用 re.compile()函数创建一个 Regex 对象(记得使用原始字符串)。
3.向 Regex 对象的 search()方法传入想查找的字符串。它返回一个 Match 对象。
4.调用 Match 对象的 group()方法,返回实际匹配文本的字符串。

一、search()方法
(1)正则表达式字符串中的第一对括号是第 1 组。第二对括号是第 2 组。向 group()
匹配对象方法传入整数 1 或 2,就可以取得匹配文本的不同部分。向 group()方法传
入 0 或不传入参数,将返回整个匹配的文本。
>>> phoneNumRegex = re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d\d)')
>>> mo = phoneNumRegex.search('My number is 415-555-4242.')
>>> mo.group(1)
'415'
>>> mo.group(2)
'555-4242'
>>> mo.group(0)
'415-555-4242'
>>> mo.group()
'415-555-4242

(2)如果想要一次就获取所有的分组,请使用 groups()方法
>>> areaCode, mainNumber = mo.groups()
>>> print(areaCode)
415
>>> print(mainNumber)
555-4242

(3)是如果你需要在文本中匹配括号,需要用倒斜杠对(和)进行字符转义
 re.compile(r'(\(\d\d\d\)) (\d\d\d-\d\d\d\d)')

(4)字符 | 称为“管道”。正则表达式 r'Batman|Tina Fey'将匹配'Batman'或'Tina Fey
 heroRegex = re.compile (r'Batman|Tina Fey')

(5)假设你希望匹配'Batman'、'Batmobile'、'Batcopter'和'Batbat'中任意一个。因为所有这
些字符串都以 Bat 开始,所以如果能够只指定一次前缀,就很方便。
 batRegex = re.compile(r'Bat(man|mobile|copter|bat)')

(6)字符?表明它前面的分组在这个模式中是可选的,如下有没有wo都是匹配的
>>> batRegex = re.compile(r'Bat(wo)?man')
>>> mo1 = batRegex.search('The Adventures of Batman')
>>> mo1.group()
'Batman'
>>> mo2 = batRegex.search('The Adventures of Batwoman')
>>> mo2.group()
'Batwoman’

(7)*(称为星号)意味着“匹配零次或多次”,即星号之前的分组,可以在文本中出现任意次。
 re.compile(r'Bat(wo)*man')
'Batman',Batwoman','Batwowowowoman'

(8)+(加号)则意味着“匹配一次或多次”。
 re.compile(r'Bat(wo)+man')
'Batwoman','Batwowowowoman'

(9)如果想要一个分组重复特定次数,就在正则表达式中该分组的后面,跟上花括
号包围的数字。例如,正则表达式(Ha){3}将匹配字符串'HaHaHa',但不会匹配'HaHa',
因为后者只重复了(Ha)分组两次。
除了一个数字,还可以指定一个范围,即在花括号中写下一个最小值、一个逗号和
一个最大值。例如,正则表达式(Ha){3,5}将匹配'HaHaHa'、'HaHaHaHa'和'HaHaHaHaHa'。
(Ha){3,}将匹配 3 次或更多次实例,(Ha){,5}将匹配 0 到 5 次实例。


二、findall()方法
search()将返回一个Match对象,包含被查找字符串中的“第一次”匹配的文本,而 findall()方法将返回一组
字符串,包含被查找字符串中的所有匹配。
>>> phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
>>> mo = phoneNumRegex.search('Cell: 415-555-9999 Work: 212-555-0000')
'415-555-9999'    #第一次匹配到的
>>> phoneNumRegex.findall('Cell: 415-555-9999 Work: 212-555-0000')
['415-555-9999', '212-555-0000']    #所有符合的

作为 findall()方法的返回结果的总结,请记住下面两点:
1.如果调用在一个没有分组的正则表达式上,例如\d\d\d-\d\d\d-\d\d\d\d,方法
findall()将返回一个匹配字符串的列表,例如['415-555-9999', '212-555-0000']。
2.如果调用在一个有分组的正则表达式上,例如(\d\d\d)-(\d\d\d)-(\d\d\d\d),方
法 findall()将返回一个字符串的元组的列表(每个分组对应一个字符串),例如[('415', 
'555', '1122'), ('212', '555', '0000')]。

三、字符分类

\d :0 到 9 的任何数字
\D: 除 0 到 9 的数字以外的任何字
\w:任何字母、数字或下划线字符(可以认为是匹配“单词”字符)
\W: 除字母、数字和下划线以外的任何字符
\s :空格、制表符或换行符(可以认为是匹配“空白”字符)
\S: 除空格、制表符和换行符以外的任何字符

用方括号【】可以定义字符分类,短横表示字母或数字的范围
字符分类[a-zA-Z0-9]将匹配所有小写字母、大写字母和数字。
在方括号内,普通的正则表达式符号不会被解释。

四、其他符号
在正则表达式的开始处使用插入符号(^),表明匹配必须发生在被查找文本开始处。
再正则表达式的末尾加上美元符号($),表示该字符串必须以这个正则表达式的模式结束。
如:正则表达式 r'^Hello'匹配以'Hello'开始的字符串。
正则表达式 r'\d$'匹配以数字 0 到 9 结束的字符串。
正则表达式 r'^\d+$'匹配从开始到结束都是数字的字符串。
>>> wholeStringIsNum = re.compile(r'^\d+$')
>>> wholeStringIsNum.search('1234567890')
<_sre.SRE_Match object; span=(0, 10), match='1234567890'>
>>> wholeStringIsNum.search('12345xyz67890') == None
True
>>> wholeStringIsNum.search('12 34567890') == None
True

总结:
 ?匹配零次或一次前面的分组。
 *匹配零次或多次前面的分组。
 +匹配一次或多次前面的分组。
 {n}匹配 n 次前面的分组。
 {n,}匹配 n 次或更多前面的分组。
 {,m}匹配零次到 m 次前面的分组。
 {n,m}匹配至少 n 次、至多 m 次前面的分组。
 {n,m}?或*?或+?对前面的分组进行非贪心匹配。
 ^spam 意味着字符串必须以 spam 开始。
 spam$意味着字符串必须以 spam 结束。
 .匹配所有字符,换行符除外。
 \d、\w 和\s 分别匹配数字、单词和空格。
 \D、\W 和\S 分别匹配出数字、单词和空格外的所有字符。
 [abc]匹配方括号内的任意字符(诸如 a、b 或 c)。
 [^abc]匹配不在方括号内的任意字符。


 

 

 
#! python2
# phoneAndEmail.py - Finds phone numbers and email addresses on the clipboard.
import pyperclip,re
#电话号码的匹配正则表达式
phoneRegex = re.compile(r'''(
    (\d{3}|\(\d{3}\))? # area code
    (\s|-|\.)? # separator
    (\d{3}) # first 3 digits
    (\s|-|\.) # separator
    (\d{4}) # last 4 digits
    (\s*(ext|x|ext.)\s*(\d{2,5}))? # extension
)''', re.VERBOSE)


# Create email regex.
emailRegex = re.compile(r'''(
     [a-zA-Z0-9._%+-]+ # username
     @ # @ symbol
     [a-zA-Z0-9.-]+ # domain name
      (\.[a-zA-Z]{2,4}) # dot-something
)''', re.VERBOSE)


# Find matches in clipboard text.
text = str(pyperclip.paste())    #获取剪切板上复制的文本
matches = []
for groups in phoneRegex.findall(text):    #findall表示查找出所有符合表达式的字符串
    phoneNum = '-'.join([groups[1], groups[3], groups[5]])    #用-连接电话号码
    if groups[8] != '':
        phoneNum += ' x' + groups[8]
    matches.append(phoneNum)    #列表中添加字符串
for groups in emailRegex.findall(text):    #查找所有的email
    matches.append(groups[0])    #添加

# Copy results to the clipboard.
if len(matches) > 0:
    pyperclip.copy('\n'.join(matches))    #matches列表中的项换行
    print('Copied to clipboard:')
    print('\n'.join(matches))
else:
    print('No phone numbers or email addresses found.')


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值