如何反转正则表达式模式?匹配非符号开头的单词
解决方法
首先你原来的正则[@^#!%&*].*?\s本身就有问题:它会匹配符号开头到空格的内容(包括空格),处理字符串末尾的单词时会失效,也没考虑单词后的标点(比如@world!里的!)。
要提取不以@^#!%&*开头的单词,可以用两种正则思路实现:
方法1:直接匹配符合要求的单词
用负向预查定位单词起始位置,确保第一个字符不是指定符号,再匹配整个单词:
import re exampleString = 'Hello @world! This is a #sample ^string 5with @words that ^start with symbols.' pattern = r'(?<!\S)(?![@^#!%&*])\S+' result = re.findall(pattern, exampleString) print(result)
输出:
['Hello', 'This', 'is', 'a', '5with', 'that', 'with', 'symbols.']
正则各部分解释:
(?<!\S):确保当前位置前面是空白字符或字符串开头(精准定位单词的起始点)(?![@^#!%&*]):负向预查,排除第一个字符是指定符号的情况\S+:匹配一个或多个非空白字符(完整的单词,包括末尾的标点)
你之前用(?!)没效果,大概率是没定位到单词的起始边界,直接在错误的位置使用了预查,导致匹配范围混乱。
方法2:先移除不符合的单词,再提取剩余内容
先把所有符号开头的单词替换为空,再分割剩余内容:
import re exampleString = 'Hello @world! This is a #sample ^string 5with @words that ^start with symbols.' # 匹配所有符号开头的单词并替换为空 cleaned_str = re.sub(r'(?<!\S)[@^#!%&*]\S*', '', exampleString) # 分割成单词并过滤空字符串 result = [word for word in cleaned_str.split() if word] print(result)
输出和方法1一致。这里的匹配正则(?<!\S)[@^#!%&*]\S*:
(?<!\S)定位单词起始点[@^#!%&*]匹配开头的符号\S*匹配符号后的所有非空白字符(完整的符号开头单词)
内容的提问来源于stack exchange,提问作者X4tra
相关产品推荐
相关产品推荐

