2022年9月15日

正则表达式: 匹配不包含某些字符串

经常我们会遇到想找出不包含某个字符串的文本,程序员最容易想到的是在正则表达式里使用,^(hede)来过滤”hede”字串,但这种写法是错误的。我们可以这样写:[^hede],但这样的正则表达式完全是另外一个意思,它的意思是字符串里不能包含‘h',‘e',‘d'三个但字符。那什么样的正则表达式能过滤出不包含完整“hello”字串的信息呢? 事实上,说正则表达式里不支持逆向匹配并不是百分之百的正确。就像这个问题,我们就可以使用否定式查找来模拟出逆向匹配,从而解决我们的问题: 代码如下: ^((?!hede).)*$ 上面这个表达式就能过滤出不包含‘hede'字串的信息。我上面也说了,这种写法并不是正则表达式“擅长”的用法,但它是可以这样用的。 解释 一个字符串是由n个字符组成的。在每个字符之前和之后,都有一个空字符。这样,一个…
2022年9月15日

正则表达式: (?= (?: (?! 的理解

要理解?=和?!,首先需要理解前瞻,后顾,负前瞻,负后顾四个概念: // 前瞻: exp1(?=exp2) 查找exp2前面的exp1 // 后顾: (?<=exp2)exp1 查找exp2后面的exp1 // 负前瞻: exp1(?!exp2) 查找后面不是exp2的exp1 // 负后顾: (?<!exp2)exp1 查找前面不是exp2的exp1 举例: "中国人".replace(/(?<=中国)人/, "rr") // 匹配中国人中的人,将其替换为rr,结果为 中国rr "法国人".replace(/(?<=中国)人/, "rr") // 结果为 法国人,因为人前面不是中国,所以无法匹配到 要理解?:则需要理解捕获分组和非捕获分组的概念: ()表示捕获分组,()会把每个分组里的匹配的值保存起来,使用$n(n是一个数字,表示第n个捕获组…
2022年9月11日

正则表达式: 在线测试 Regex Regular Expression Tester

Regular expression tester with syntax highlighting, explanation, cheat sheet for PHP/PCRE, Python, GO, JavaScript, Java, C#/.NET. https://regex101.com/…
2022年7月16日

正则表达式需要转义的特殊字符

概述 正则表达式有以下特殊字符需要转义: 特别字符 说明 $ 匹配输入字符串的结尾位置。如果设置了RegExp对象的Multiline属性,则$也匹配‘\n'或‘\r'。要匹配$字符本身,请使用\$。 ( ) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用\(和\)。 * 匹配前面的子表达式零次或多次。要匹配*字符,请使用\*。 + 匹配前面的子表达式一次或多次。要匹配+字符,请使用\+。 . 匹配除换行符\n之外的任何单字符。要匹配.,请使用\。 [ ] 标记一个中括号表达式的开始。要匹配[,请使用\[。 ? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配?字符,请使用\?。 \ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如,‘n'匹配字符‘n'。'\n'匹配换行符。序…
2022年7月6日

Python: re模块 正则表达式 匹配分组

1. 匹配分组相关正则表达式 代码 功能 | 匹配左右任意一个表达式 (ab) 将括号中字符作为一个分组 \num 引用分组num匹配到的字符串 (?P<name>) 分组起别名 (?P=name) 引用别名为name分组匹配到的字符串 示例1:| 需求:在列表中["apple", "banana", "orange", "pear"],匹配apple和pear import re # 水果列表 fruit_list = ["apple", "banana", "orange", "pear"] # 遍历数据 for value in fruit_list: # | 匹配左右任意一个表达式 match_obj = re.match("apple|pear", value) if match_obj: print("%s是我想要的" % match_obj.group()) else: prin…
2022年6月12日

Python: 练习 正则表达式 匹配文件名/扩展名

# 匹配文件名 import re file_name0 = "123.test.abc.zip" file_name1 = ".test.abc.zip" file_name2 = ".zip" file_name3 = "test" re_ = r".*?(?=\.[^\.]*$)|[^\.]+" file_name_0 = re.match(re_, file_name0) file_name_1 = re.match(re_, file_name1) file_name_2 = re.match(re_, file_name2) file_name_3 = re.match(re_, file_name3) print(file_name_0) print(file_name_1) print(file_name_2) print(file_name_3) # 匹配扩展名 impor…
2022年3月5日

Python: re.sub使用lambda函数作为参数

import re word_string = """ <head>iph</head> """ regular = "<.*?>((\w*)(<.*?>))" result = re.sub(regular, lambda x:x.group(2), word_string) print(result) 运行结果: iph Process finished with exit code 0…
2022年3月5日

正则表达式中(?:pattern)、(?=pattern)、(?!pattern)、(?<=pattern)和(?<!pattern)

(?:pattern)# ()表示捕获分组,()会把每个分组里的匹配的值保存起来,从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推 (?:)表示非捕获分组,和捕获分组唯一的区别在于,非捕获分组匹配的值不会保存起来 import re a = "123abc456ww" pattern = "([0-9]*)([a-z]*)([0-9]*)" print(re.search(pattern,a).group(0,1,2,3)) pattern = "(?:[0-9]*)([a-z]*)([0-9]*)" print(re.search(pattern,a).group(0,1,2)) 可以看到 (?:[0-9]*) 匹配的第一个 [0-9]*  没有保存下来,即没有保存匹配到的“123”,而([0-9]*)则保存了下来。…
2022年3月5日

正则表达式: 不包含特定字符串

概述 做日志分析工作的经常需要跟成千上万的日志条目打交道,为了在庞大的数据量中找到特定模式的数据,常常需要编写很多复杂的正则表达式。例如枚举出日志文件中不包含某个特定字符串的条目,找出不以某个特定字符串打头的条目,等等。 使用否定式前瞻 正则表达式中有前瞻(Lookahead)和后顾(Lookbehind)的概念,这两个术语非常形象的描述了正则引擎的匹配行为。需要注意一点,正则表达式中的前和后和我们一般理解的前后有点不同。一段文本,我们一般习惯把文本开头的方向称作“前面”,文本末尾方向称为“后面”。但是对于正则表达式引擎来说,因为它是从文本头部向尾部开始解析的(可以通过正则选项控制解析方向),因此对于文本尾部方向,称为“前”,因为这个时候,正则引擎还没走到那块,而对文本头部方向,则称为“后”,因为正则引擎已经走过了那…
2022年3月5日

正则表达式匹配任意字符(包括换行符)

正则表达式中,“.”(点符号)匹配的是除了换行符“\n”以外的所有字符,但有时候我们需要匹配包括换行符在内的字符。 手册上还有一句话:要匹配包括 '\n' 在内的任何字符,请使用像 '[.\n]' 的模式,但是发现[.\n]*不可以。 经查,发现了几种正则表达式匹配任意字符(包括换行符)的方法: [\s\S]* [\d\D]* [\w\W]* 另外,[.\s]*不可以,(.|\s)*可以。…