一、正则表达式与findall函数
正则表达式是一种用于匹配字符串的强大工具,可以用于字符串的搜索、替换等操作。而在Python中,re模块提供了对正则表达式的支持。其中,findall函数是re模块中最常用的函数之一。它能在字符串中查找出所有匹配某个正则表达式的子串,并以列表的形式返回。
import re s = "I have a dream, a song to sing" pattern = "a" result = re.findall(pattern, s) print(result) # ['a', 'a']
在上面的例子中,我们定义了一个字符串s和一个正则表达式pattern,然后调用了re模块中的findall函数,返回了所有匹配pattern的子串,并以列表的形式返回。在这个例子中,返回的列表为[‘a’, ‘a’],表示字符串s中有两个字符’a’。
二、findall函数的特点
findall函数具有以下几个特点:
1、返回所有匹配的子串
findall函数会在字符串中查找所有匹配某个正则表达式的子串,并以列表的形式返回。
import re s = "I have a dream, a song to sing" pattern = "a" result = re.findall(pattern, s) print(result) # ['a', 'a']
2、返回的结果不包含正则表达式中的分组
在正则表达式中,可以使用小括号来定义一个分组,findall函数会返回所有匹配的子串,但不包含这些分组。
import re s = "I have a dream, a song to sing" pattern = r"(?Pa)(?P[a-z])" result = re.findall(pattern, s) print(result) # [('a', 'h'), ('a', 'o')]
在这个例子中,我们定义了一个正则表达式pattern,使用了两个分组,其中分别是字符’a’和任意小写字母。findall函数返回结果为[(‘a’, ‘h’), (‘a’, ‘o’)],只包含匹配的子串,而不包括这两个分组。
3、返回的结果是字符串中匹配子串的拼接
如果正则表达式中有多个分组,那么findall函数返回的结果是这些匹配子串的拼接。
import re s = "I have a dream, a song to sing" pattern = r"(a)([a-z])" result = re.findall(pattern, s) print(result) # [('a', 'h'), ('a', 'o')]
在这个例子中,我们修改了正则表达式pattern,将h和o后面的小写字母放在了一个分组中。函数返回的结果为[(‘a’, ‘h’), (‘a’, ‘o’)],是匹配子串的拼接。可以看到,匹配的子串分别是”ah”和”ao”。
三、findall函数在多行字符串中的应用
除了在普通字符串中应用,findall函数也可以在多行字符串中应用,并且支持使用re.DOTALL和re.MULTILINE来处理多行字符串。
1、处理多行字符串
我们可以使用多行字符串来存储一篇文章的内容,然后使用findall函数来查找其中包含的其他信息。
import re s = """ Hello, my friend. How are you doing? It is a nice day today. We should go for a walk. Let's have lunch together. How about 12:30pm? """ pattern = r"\d{1,2}:\d{1,2}(am|pm)" result = re.findall(pattern, s) print(result) # ['12:30pm']
在这个例子中,我们定义了一个多行字符串s,其中包含一段对话,其中有一个时间的提醒“12:30pm”。我们使用findall函数和一个正则表达式,来查找这个时间是否在这个对话中出现。函数返回结果为[’12:30pm’]。
2、使用re.DOTALL和re.MULTILINE处理多行字符串
在多行字符串中,可能会出现换行符,这对正则表达式的匹配造成了一定的影响。但是,可以使用re.DOTALL和re.MULTILINE来处理这个问题。
使用re.DOTALL可以将”.”匹配任意单个字符的行为扩展到整个字符串,从而能够匹配多行字符串。
import re s = """ Hello, my friend. How are you doing? It is a nice day today. We should go for a walk. Let's have lunch together. How about 12:30pm? """ pattern = r"\d{1,2}:\d{1,2}(am|pm)" result = re.findall(pattern, s, re.DOTALL) print(result) # ['12:30pm']
在这个例子中,我们在多行字符串中加入了一个换行符,并且使用re.DOTALL来将”.”匹配扩展到整个字符中,从而能够正确的匹配出时间。函数返回的结果为[’12:30pm’]。
使用re.MULTILINE可以识别”\n”作为多行字符串中一行的结束,并对”^”和”$”元字符的行为进行扩展,从而能够正确的匹配多行字符串
import re s = """ Lines may contain up to three words. """ pattern = r"^\w+|\w+$" result = re.findall(pattern, s, re.MULTILINE) print(result) # ['Lines', 'may', 'contain', 'up', 'to', 'three', 'words']
在这个例子中,我们使用re.MULTILINE来扩展”^”和”$”元字符的行为,并且使用正则表达式来匹配每行字符串的开头和结尾,从而能够正确地识别出每行中的单词。函数返回的结果为[‘Lines’, ‘may’, ‘contain’, ‘up’, ‘to’, ‘three’, ‘words’]。
四、findall函数与列表推导式的结合使用
在Python中,我们经常会使用列表推导式的方式来处理列表和字符串等数据类型。而在使用findall函数的时候,也可以结合使用列表推导式的方式,从而更加灵活地处理数据。
1、使用列表推导式筛选数据
使用findall函数和列表推导式的结合,可以帮助我们更加灵活地筛选出需要的数据。
import re s = "I have 10 apples, 20 oranges and 30 grapes" pattern = r"\d+" result = [int(x) for x in re.findall(pattern, s)] print(result) # [10, 20, 30]
在这个例子中,我们使用正则表达式来匹配字符串s中的数字,findall函数返回结果为[’10’, ’20’, ’30’],然后使用列表推导式和int函数来将这些字符串转化为数字,从而得到我们需要的结果[10, 20, 30]。
2、使用列表推导式处理字符串
除了筛选数据之外,还可以使用列表推导式和findall函数来处理字符串,例如将字符串中的某些字符替换掉。
import re s = "hello, world!" pattern = r"[aeiou]" result = "".join(["*" if c in re.findall(pattern, s) else c for c in s]) print(result) # h*ll*, w*rld!
在这个例子中,我们使用正则表达式来匹配字符串s中的元音字母,findall函数返回结果为[‘e’, ‘o’],然后使用列表推导式和if语句,将这些元音字母替换为”*”,最后使用join函数将所有字符拼接起来形成新的字符串”h*ll*, w*rld!”。
原创文章,作者:TDVJI,如若转载,请注明出处:https://www.506064.com/n/349439.html