python之常用正则表达式
以下整理python中常用的正则符号,相信能够熟悉掌握这些正则符号,大部分字符串处理将会游刃有余。
符号 | 含义 | 示例 |
. | 可以匹配任意字符,但不包含换行符\’\n\’ | Pyt.on ->Pytmon |
\ | 转义符,一般用于保留字符串中的特殊元字符 | 10\.3 ->10.3 |
| | 逻辑或 | 人a|A->人a或者人A |
[] | 用于匹配的一组字符 | m[aA]n ->man 或者 mAn |
\d与\D | \d匹配任意数字,\D代表所有的非\d | 今天\d号 ->今天3号 |
\s与\S | \s匹配任意空白字符,\S代表所有非\s | 你\s好 ->你 好 |
\w与\W | \w匹配字母数字和下划线,\W代表所有非\w | P\wy ->Pay 或者 P3y P_y |
* | 匹配前一个字符0到无穷次 | OK* ->O或者OK 或 OKK |
+ | 匹配前一个字符1到无穷次 | OK+ ->OK或者OK 或 OKK |
? | 匹配前一个字符0到1次 | OK? ->O或者OK |
{m} | 匹配前一个字符m次 | OK{3} ->OKKK |
{m,n} | 匹配前一个字符m到n次 | OK{1,2} ->OK或者OKK |
另外 (.*?)用于分组,默认返回括号内的匹配内容,
在Python开发爬虫过程中经常会遇到正则表达式,其中(.*?) 的使用概率较高,那么这个正则表达式到底什么意思呢?
“.*?” 表示非贪心算法,表示要精确的配对。
“.*”表示贪心算法,表示要尽可能多的匹配
“()” 表示要获取括弧之间的信息。
基于正则表达式完成字符串的查询,替换和分割操作,这些操作都需要导入re模块,并使用如下几个函数。
1.匹配查询函数
findall(pattern, string, flags=0)
findall 函数可以对指定的字符串进行遍历匹配,获取字符串中所有匹配的子串,并返回一个列表结果。该函数的参数含义如下:
pattern:指定需要匹配的正则表达式。
string:指定待处理的字符flags:指定匹配模式,常用的值可以是re.I、re.M、re.S和re.X。
re.I的模式是让正则表达式对大小写不敏感;
re.M的模式是让正则表达式可以多行匹配;
re.S的模式指明正则符号.可以匹配任意字符,包括换行符\n;
re.X模式允许正则表达式可以写得更加详细,如多行表示、忽略空白字符、加入注释等。
2.匹配替换函数
sub(pattern, repl, string, count=0, flags=0)
sub函数的功能是替换,类似于字符串的replace方法,该函数根据正则表达式把满足匹配的内容替换为repl。该函数的参数含义如下:
pattern:同findall函数中的pattern。
repl: 指定替换成的新值。
string:同findall函数中的string。
count:用于指定最多替换的次数,默认为全部替换。
flags:同findall函数中的flags。
3.匹配分割函数
split(pattern, string, maxsplit=0, flags=0)
split函数是将字符串按照指定的正则表达式分隔开,类似于字符串的split方法。该函数的具体参数含义如下:
pattern:同findall函数中的pattern。
maxsplit:用于指定最大分割次数,默认为全部分割。
string:同findall函数中的string。
flags:同findall函数中的flags。
示例:
import re
string8 = “{ymd:\’2018-01-01\’,tianqi:\’晴\’,aqiInfo:\’轻度污染\’},{ymd:\’2018-01-02\’,tianqi:\’阴~小雨\’,aqiInfo:\’优\’},{ymd:\’2018-01-03\’,tianqi:\’小雨~中雨\’,aqiInfo:\’优\’},{ymd:\’2018-01-04\’,tianqi:\’中雨~小雨\’,aqiInfo:\’优\’}”
#取出字符串中所有的天气状态
print(re.findall(“tianqi:\'(.*?)\’ \’\’,string8)) #此处注意观察,(.*?)\’ 这里面使用的是精确匹配,当匹配到后面是\’ 号就停止
string9=”I don\’t want to be someone that you\’re settling for. I don\’t want to be someone that anyone settles for. “
print(re.findall(\’\w*o\w\’,string9,flags = re.I)) #此处留个缺陷” don\’t you\’re “匹配出来不是我们想要的结果,用于思考
##out:
[\'don\', \'someon\', \'you\', \'for\', \'don\', \'someon\', \'anyon\', \'for\']
string10 = \’据路透社报道,由于土耳其军队离美军驻地已经过近,美军数架F-15战斗机和AH-64“阿帕奇”攻击直升机在土军阵地上方进行了威慑性飞行。\’
print(re.sub(\'[,。,“”a-zA-Z0-9()]\’,\’\’,string10)) #将标点符号,数字和字母删除
out:
据路透社报道由于土耳其军队离美军驻地已经过近美军数架-战斗机和-阿帕奇攻击直升机在土军阵地上方进行了威慑性飞行
#将每一部分的内容分割开
string11 = \’2室2厅 | 101.62平 |低区/7层 | 朝南 \n 上海未来 – 浦东-金杨 -2005年建\’
split =re.split(\'[-\|\n]\’,string11) #[]列表内的所有符号作为分隔的标志
print(split)
split_strip = [i.strip() for i in split]
print(split_strip )
out:
[\'2室2厅\', \'101.62平\', \'低区/7层\', \'朝南\', \'上海未来\', \'浦东\', \'金杨\', \'2005年建\']