持续更新中…
关于re方法的补充
1、查找
- 如果遇到需要从一段字符串中取某类型的字符的话,往往采用re.search()和re.findall()方法
例如:我们需要取一段字符串“abcsdjkjj”中的最后一个字母
import re
s1='abcsdjkjj'
result=re.findall(r"[A-Za-z]",s1)[-1]
print(result)
这里用了一个巧方法,把取最后一个字符放到了列表中,并没有用正则表达式来进行抓取,降低了难度。
- 把一个字符串中的所有字母找出来并拼成一个字符串
这时我们需要先用findall方法来找出所有字母,然后利用拼接的方法,即join()方法来进行连接即可。
import re
pattern = re.compile(r"[A-Za-z]")
result="".join(pattern.findall("a231afcr2f34feedf"))
print(result)
- 学会了找字符串中的单个字母,我们还会遇到需要找单词的。这时只需要一个小变化,上面的r"[A-Za-z]“换成r”[A-Za-z]+"
import re
s="I am 13 years old"
pattern = re.compile(r"[A-Za-z]+")
result = pattern.findall(s)
print(result)
2、特殊字符的使用
我们需要匹配出一行字符串中的所有开头的字母内容时,这时就需要靠字符规则了,首先想到的是’^’,但是肩号并不能匹配出所有的字母开头,而是匹配出一个字符串的第一个字母。
那么我们可以使用\b,这个代表着单词的开头或者结尾或者是单词的分界处的符号。
关于\b,在python02-正则表达式中我总结的比较浅,这里详解一下,\b就是隐式位置,隐式位置的含义为:前后必不全是\w。
例如:I have a nice girl。 其中的a表示为:
空格\ba\b空格,也就是说第一个\b隐式位置,前面是空格,后面是字符\w。代表的是单词开头,另一个\b,后面是空格,前面是字符,所以它代表的是单词的结尾。
记住:字符,空格均是显式位置,\b代表的是隐式位置,是不可见的。
那么我们要提取出一行字符串的所有开头字母,就可以用下面这种方法:
import re
s="i love you not because of who you are!"
print(re.findall(r"\b\w",s))
3、字符集的使用
- 我们还会遇到需要匹配度比较高的字符串,比如需要匹配2,3,4或者多个按指定位置排列的字符串,那么我们可以采用python02中的‘[字符集]’方法:
写一个正则表达式,使其能同时识别下面所有的字符串:‘bat’,‘bit’, ‘but’, ‘hat’, ‘hit’, 'hut‘
import re
s="'bat', 'bit', 'but', 'hat', 'hit', 'hut','yat','har','hot'"
print(re.findall(r"..t",s))
print(re.findall(r"[bh][aiu]t",s))
- 如果需要匹配字符串中完整的年月日和时间字段,时间的匹配也可以使用字符集的方式来进行匹配,即指定每一位的数字范围。
import re
s="我出生时间为2001-01-01 00:00:00,今天时间为2021-11-13 12:20:00"
#首先去除分隔符
for i in s.split(","):#年份指定第一位是1或2,但是后三位是0-9随意,三次{3}
result = re.search(r"[12][0-9]{3}-([0][1-9]|[1][0-2])-([0-2][0-9]|[3][01]) ([01][0-9]|[2][0-3]):([0-5][0-9]):([0-5][0-9])",i)
if result:
print(result.group())
else:
continue
- 将每行中的电子邮件地址替换为自己的电子邮件地址,匹配同样,但是由于电子邮件的格式并没有时间那么规范,所以单纯用特殊字符就可以解决:
#将每行中的电子邮件地址替换为自己的电子邮件地址
import re
s="""
1234867@qq.com
lihuali@sdcion.com
"""
s1="123456@azhe.com"
for i in s.split("\n"):
result = re.search(r"[\w]+@[\w]+.com",i)
if result:
s=s.replace(result.group(),s1)
else:
continue
print(s)