【python】Regex相关函数的使用

家住魔仙堡 提交于 2020-03-04 11:30:23

re.search

re.search(pattern, string)在字符串的任何位置搜索正则表达式的匹配。 如果找到,则返回一个匹配对象;如果没有,则返回 None。

phone_re = r"[0-9]{3}-[0-9]{3}-[0-9]{4}"
text  = "Call me at 382-384-3840."
match = re.search(phone_re, text)
match
#<_sre.SRE_Match object; span=(11, 23), match='382-384-3840'>

尽管返回的匹配对象具有各种有用的属性,但我们通常使用 re.search 来测试一个是否出现在字符串中。

if re.search(phone_re, text):
    print("Found a match!")

另一个常用的方法 re.match (pattern,string)的行为与 re.search 相同,但只在字符串的开头检查匹配,而不是在字符串的任何位置检查匹配。

re.findall

我们使用 re.findall (pattern,string)提取所有匹配的子字符串。 此方法会返回字符串中所有匹配的list。

gmail_re = r'[a-zA-Z0-9]+@gmail\.com'
text = '''
From: email1@gmail.com
To: email2@yahoo.com and email3@gmail.com
'''
re.findall(gmail_re, text)
#['email1@gmail.com', 'email3@gmail.com']#

Regex Groups

使用正则表达式组,我们可以通过将子字符串包装在括号中()来指定从正则表达式中提取的子字符串。 当要匹配的内容包含组时,re.findall 返回包含匹配内容的元组列表。

phone_re = r"[0-9]{3}-[0-9]{3}-[0-9]{4}"
text  = "Sam's number is 382-384-3840 and Mary's is 123-456-7890."
re.findall(phone_re, text)
#['382-384-3840', '123-456-7890']

为了将电话号码的三个或四个数字组分开,我们可以将每个数字组用括号括起来。

# 相同的正则表达式,数字组周围用括号括起来
phone_re = r"([0-9]{3})-([0-9]{3})-([0-9]{4})"
text  = "Sam's number is 382-384-3840 and Mary's is 123-456-7890."
re.findall(phone_re, text)
#[('382', '384', '3840'), ('123', '456', '7890')]

如前所述,re.findall 返回一个元组列表,其中包含匹配电话号码的各个组件。

re.sub

re.sub (pattern, replacement, string)将所有出现的 pattern 替换为提供的字符串中的 replacement。 这个方法的行为类似于 Python 字符串方法 str.sub,但是使用正则表达式来匹配模式。
在下面的代码中,我们通过用破折号替换日期分隔符来更改日期以使其具有通用格式。

messy_dates = '03/12/2018, 03.13.18, 03/14/2018, 03:15:2018'
regex = r'[/.:]'
re.sub(regex, '-', messy_dates)
#'03-12-2018, 03-13-18, 03-14-2018, 03-15-2018'

re.split

re.split (pattern,string)会拆分输入字符串。 此方法的行为类似于 Python 字符串方法 str.split,但这个是使用正则表达式进行拆分。
在下面的代码中,我们使用 re.split 将章节名从书目表中的页码中分离出来。

toc = '''
PLAYING PILGRIMS============3
A MERRY CHRISTMAS===========13
THE LAURENCE BOY============31
BURDENS=====================55
BEING NEIGHBORLY============76
'''.strip()

# 首先分为几行
lines = re.split('\n', toc)
lines

#['PLAYING PILGRIMS============3',
# 'A MERRY CHRISTMAS===========13',
# 'THE LAURENCE BOY============31',
# 'BURDENS=====================55',
# 'BEING NEIGHBORLY============76']

# 然后再把章节名称和页数分离出来
split_re = r'=+' 
[re.split(split_re, line) for line in lines]
#[['PLAYING PILGRIMS', '3'],
# ['A MERRY CHRISTMAS', '13'],
# ['THE LAURENCE BOY', '31'],
# ['BURDENS', '55'],
# ['BEING NEIGHBORLY', '76']]

pandas

pandas对象有一个str 属性,该属性支持使用 Python 字符串方法的字符串操作。 而且属性也支持来自 re 模块的一些函数。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!