https://www.cnblogs.com/yjh-bl/p/11096594.html
https://zhuanlan.zhihu.com/p/127807805
https://docs.python.org/zh-cn/3/library/re.html
[] () {}
圆括号()是组,主要应用在限制多选结构的范围/分组/捕获文本/环视/特殊模式处理
(\s*)表示连续空格的字符串
(abc|bcd|cde),表示这一段是abc、bcd、cde三者之一,顺序也必须一致
方括号是单个匹配 字符集/排除字符集/命名字符集
[\s*] 表示空格或者*号
\s{1,3}表示匹配1到3个空格
(0-9)匹配'0-9'本身。[0-9]*匹配数字
p = re.compile(r'[0-9][^x|y]')
re.search(p,'3xt')
new_address = re.sub('(号|弄|栋|幢|号楼|附近)$', '', address)
time_pattern = re.compile(r'[(](.*?)[)]', re.S)
time_h_pattern = re.compile(r'h(\d*)', re.S)
time_m_pattern = re.compile(r'm(\d*)', re.S)
import re
import json
pre = 'recall_data_gd='
suffix = ' where'
re_compile = re.compile(f"{pre}'(.*?)'{suffix}")
if __name__ == '__main__':
with open("/Users/shilulu/Downloads/update_gz_0.sql", "r") as f:
with open("/Users/shilulu/Downloads/update_gz_0_0.sql", "w") as f2:
while True:
l = f.readline()
if l:
ll = re.findall(re_compile, l)
s = ll[0]
replaced = s.replace("'", "''")
l_replace = re.sub(re_compile, pre + "'" + replaced + "'" + suffix, l)
f2.write(l_replace)
else:
break
1.查找一个匹配项
查找并返回一个匹配项(Match)的函数有3个:search、match、fullmatch,他们的区别分别是:
search: 查找任意位置的匹配项
match: 必须从字符串开头匹配
fullmatch: 整个字符串与正则完全匹配
2.查找多个匹配项
现在来看看查找多项,查找多项函数主要有:findall函数 与 finditer函数:
findall: 从字符串任意位置查找,返回一个列表
finditer:从字符串任意位置查找,返回一个迭代器
3.分割
re.split(pattern, string, maxsplit=0, flags=0) 函数:用 pattern 分开 string , maxsplit表示最多进行分割次数, flags表示模式,就是上面我们讲解的常量!
4.替换
re.sub(pattern, repl, string, count=0, flags=0) 函数参数讲解:repl替换掉string中被pattern匹配的字符, count表示最大替换次数,flags表示正则表达式的常量。
值得注意的是:sub函数中的入参:repl替换内容既可以是字符串,也可以是一个函数哦! 如果repl为函数时,只能有一个入参:Match匹配对象。
数量
多字符匹配(表示数量)
* 匹配前一个字符出现0次或者无限次,即可有可无
+ 匹配前一个字符出现1次或者无限次,即至少1次
? 匹配前一个字符出现1次或者0次,即至多1次
{m} 匹配前一个字符出现m次
{m,} 匹配前一个字符至少出现m次
{m,n} 匹配前一个字符出现从m到n次
单字符匹配(表示字符)
字符 功能
. 匹配任意1个字符(除了\n)
[] 匹配[]中列举的字符
\d 匹配数字,即0-9
\D 匹配非数字,即不是数字
\s 匹配空白,即空格,tab键 ,\n
\S 匹配非空白
\w 匹配单词字符,即a-z A-Z 0-9 _
\W 匹配非单词字符
\d == [0-9]
\D == [^0-9]
\w == [a-zA-Z0-9_]
\W == [^a-zA-Z0-9_]
表示边界
字符 功能
^ 匹配字符串开头
$ 匹配字符串结尾
\b 匹配一个单词的边界
\B 匹配非单词边界
^ 和 $ 是描述整个字符串的边界
\b 和 \B 是描述字符串中的单词边界
正则表达式 规则 可以匹配
^ 开头 字符串开头
$ 结尾 字符串结束
[ABC] […]内任意字符 A,B,C
[A-F0-9xy] 指定范围的字符 A,……,F,0,……,9,x,y
[^A-F] 指定范围外的任意字符 非A~F
AB|CD|EF AB或CD或EF AB,CD,EF
image.png
非贪婪匹配
public class Main {
public static void main(String[] args) {
Pattern pattern = Pattern.compile("(\\d+?)(0*)");
Matcher matcher = pattern.matcher("1230000");
if (matcher.matches()) {
System.out.println("group1=" + matcher.group(1)); // "123"
System.out.println("group2=" + matcher.group(2)); // "0000"
}
}
}
- 修饰符可以匹配任意个字符,包括0个字符。我们用A\d可以匹配:
A:因为\d可以匹配0个数字;
A0:因为\d可以匹配1个数字0;
A380:因为\d*可以匹配多个数字380。
修饰符+可以匹配至少一个字符。我们用A\d+可以匹配:
A0:因为\d+可以匹配1个数字0;
A380:因为\d+可以匹配多个数字380。
但它无法匹配"A",因为修饰符+要求至少一个字符。
- 修饰符?可以匹配0个或一个字符。我们用A\d?可以匹配:
A:因为\d?可以匹配0个数字;
A0:因为\d+可以匹配1个数字0。
但它无法匹配"A33",因为修饰符?超过1个字符就不能匹配了。
- 如果我们想精确指定n个字符怎么办?用修饰符{n}就可以。A\d{3}可以精确匹配:
A380:因为\d{3}可以匹配3个数字380。
- 如果我们想指定匹配n~m个字符怎么办?用修饰符{n,m}就可以。A\d{3,5}可以精确匹配:
A380:因为\d{3,5}可以匹配3个数字380;
A3800:因为\d{3,5}可以匹配4个数字3800;
A38000:因为\d{3,5}可以匹配5个数字38000。
- 如果没有上限,那么修饰符{n,}就可以匹配至少n个字符。
网友评论