文章目录
本文章首发于公众号Python for Finance
链接:https://mp.weixin.qq.com/s/boLdKv1L31377dLOKQ6irw
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
匹配字符
代码 | 功能 |
---|---|
. | 通配符,匹配任意1个字符(除了\n换行) |
[ ] | 匹配[ ]中列举的字符,里面的元素之间存在“或”的关系,[abc] 只能匹配a或b或c |
\d | 匹配数字,等价于[0,9] |
\D | 匹配非数字,等价于[^0-9] |
\s | 匹配空白,常见的空白符的形式有空格、制表符 (\t)、换行 (\n) 和回车 (\r) |
\S | 匹配非空白 |
\w | 匹配非特殊字符,即a-z、A-Z、0-9、_、中文 |
\W | 匹配特殊字符 |
\d \D
匹配数字
import re
str0 = """北向资金尾盘回流,全天净买入18.54亿元,连续4日加仓"""
result = re.findall(r'\d', str0) # 加上r模式是为了防止Python中的转义字符与正则表达式中的元字符
print(result)
结果为:
['1', '8', '5', '4', '4']
匹配非数字
import re
str0 = """北向资金尾盘回流,全天净买入18.54亿元,连续4日加仓"""
result = re.findall(r'\D', str0) # 加上r模式是为了防止Python中的转义字符与正则表达式中的元字符
print(result)
结果为:
['北', '向', '资', '金', '尾', '盘', '回', '流', ',', '全', '天', '净', '买', '入', '.', '亿', '元', ',', '连', '续', '日', '加', '仓']
\s \S
text = '''please don't
leave me
alone'''
result = re.findall(r'\s',text)
print(result)
结果为:
[' ', ' ', '\n', ' ', ' ', '\n']
量词:匹配多个字符
某个字符后的数量限定符(*
、 ?
、 +
)用来限定前面这个字符允许出现的个数。最常见的数量限定符包括 *
、 ?
和 +
(不加数量限定则代表出现一次且仅出现一次)
符号 | 匹配规则 | 示例 |
---|---|---|
* | 匹配前一个字符出现0到多次,即可有可无,等价于{0,} | ab*c 匹配 ac , abc , abbc , abbbc |
+ | 匹配前一个字符出现1到多次,即至少有1次,等价于{1,} | colou?r 匹配 color 和 colour |
? | 匹配前一个字符出现1次或者0次,即要么有1次,要么没有,等价于{0,1} | ab+c 匹配 abc , abbc , abbbc 等等,但不匹配 ac |
{n} | 匹配前一个字符出现n次 | |
{n,} | 匹配前一个字符至少出现n次 | |
{n,m} | 匹配前一个字符出现从n到m次 |
import re
str0 = """北向资金尾盘回流,全天净买入18.54亿元,连续4日加仓;其中沪股通净买入26.41亿元,深股通净卖出7.87亿元。"""
result = re.findall(r'\d+', str0)
print(result)
“+”在正则表达式里代表的是“匹配前面的子表达式一次或多次”。
在“\d+”中,子表达式就是“\d”,一个“\d”是匹配一个数字,“\d+”则就是匹配一个或者多个数字。
结果为:
['18', '54', '4', '26', '41', '7', '87']
在以上结果中,数字被小数点分开了,如18.54被分成了18和54。那么我们可以再做这样的改进。
result = re.findall(r'[\d.]+', str0)
print(result)
[]方括号代表字符集合。匹配所包含的任意一个字符。“[\d.]”即匹配一个“\d”或者一个“.”字符,再带上加“+”,就可以匹配一个或者多个了。
结果为:
['18.54', '4', '26.41', '7.87']
星号*
*+:字符u可以出现0次或1次或者多次
a = re.findall(r'colou*r', 'color')
print(a)
b = re.findall(r'colou*r', 'colour')
print(b)
c = re.findall(r'colou*r', 'colouuur')
print(c)
结果为:
['color']
['colour']
['colouuur']
加号+
u+:字符u可以出现 1 次或多次
a = re.