字符串的切分
line = "爸爸 妈妈; 儿子, 女儿,弟弟, 妹妹"
import re
print(re.split(r'[;,\s]\s*', line))
print(re.split(r'(;|,|\s)\s*', line))
fields = re.split(r'(;|,|\s)\s*', line)
print(fields[::2])
print(fields[1::2])
result:
['爸爸', '妈妈', '儿子', '女儿', '弟弟', '妹妹']
['爸爸', ' ', '妈妈', ';', '儿子', ',', '女儿', ',', '弟弟', ',', '妹妹']
['爸爸', '妈妈', '儿子', '女儿', '弟弟', '妹妹']
[' ', ';', ',', ',', ',']
总结: “\s” 代表空格,一定范围的符号用[]、(…|…|…)框起来,使用[]会去掉匹配的文本,而(…|…|…)会保留匹配的分组,可变长(0-n)的字段可以加*l,在末尾的field的切片中,最后一位代表step
字符串的开头与结尾匹配
filenames = ["Makefile", "foo.c", "bar.py", "spam.c", "spam.h"]
print(any(name.endswith(".py") for name in filenames))
print([name for name in filenames if name.endswith((".c", ".h"))])
result
True
['foo.c', 'spam.c', 'spam.h']
总结:直接使用str.startswith(),str.endswith(),any用于检验列表元素的有无,两个函数可以作为判断指标生成新的列表,注意这两个函数内部如果有多个匹配的话需要用tuple(元组)把它们括起来
也可以使用match来进行开头的匹配,代码如下
import re
url = "http://www.python.org"
res = re.match("https|http|ftp", url)
print(res != None)
print(res.group())
result
True
http
字符串的匹配与搜索
import re
text = "Today is 11/27/2012. PyCon starts 3/13/2013"
print(text.find("PyCon"))
print(re.findall(r'\d+/\d+/\d+', text))
datapat = re.compile(r'\d+/\d+/\d+')
print(datapat.findall(text))
result
21
['11/27/2012', '3/13/2013']
['11/27/2012', '3/13/2013']
find可以返回第一个匹配的位置,如果想要找到所有的匹配,可以使用findall,一方面可以直接使用,另一方面可以将模式字符串预编译为模式对象