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 (pattern,string)提取所有匹配的子字符串。 此方法会返回字符串中所有匹配的list。
gmail_re = r'[a-zA-Z0-9]+@gmail\.com'
text = '''
From: [email protected]
To: [email protected] and [email protected]
'''
re.findall(gmail_re, text)
#['[email protected]', '[email protected]']#
使用正则表达式组,我们可以通过将子字符串包装在括号中()来指定从正则表达式中提取的子字符串。 当要匹配的内容包含组时,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 (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 (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对象有一个str 属性,该属性支持使用 Python 字符串方法的字符串操作。 而且属性也支持来自 re 模块的一些函数。