regex 如果一个字母出现在一个更大的模式/单词/短语中,正确的正则表达式是什么?

ekqde3dh  于 2022-11-18  发布在  其他
关注(0)|答案(3)|浏览(104)

我希望使用正则表达式来查找给定字符串中某个字母的所有示例,但如果该字母出现在一个更大的单词/短语中,则不会。例如:
对于测试字符串:
滞后(a,1)+ 252a +最大值(3a2)/ 5pctrange(a,10)
我想获取字母'a'的所有示例,但不包括出现在以下三个单词中的字母'a':
滞后最大量程
例如,我想使用Regex来获取字母'a'的所有示例,如此处突出显示的:
滞后(a,1)+ 252
a+最大值(3a2)/ 5 个转换范围(a,10)
我尝试使用下面的正则表达式,但它总是在我想要的字母'a'后面包含字符 *:

a[^"lag|max|pctrange"]

为了提供一些上下文,我在Python中使用re模块来替换这些'a'示例:

import re
string = "lag(a,1) + 252*a + max(3a*2) / 5*pctrange(a,10)"
words = ["lag", "max", "pctrange"]
replace = "_"
re.sub(f"a[^\"{'|'.join(words)}\"]", replace, string)

这将导致(不需要的)输出:

lag(_1) + 252*_+ max(3_2) / 5*pctrange(_10)

我希望输出如下:

lag(_,1) + 252*_ + max(3_*2) / 5*pctrange(_,10)

编辑:请注意,搜索并不总是针对单个字母,例如,有时我想搜索“aa”而不是“a”,或者“bdg”而不是“a”等。更重要的是,要重点关注要排除的单词列表(例如在上面的例子中,“lag”、“max”和“pctrange”)。我不需要忽略任何其他的东西,除了在这个列表中显示的特定单词。谢谢。

b4lqfgs4

b4lqfgs41#

若要防止a在与另一个字母相邻时被匹配,请尝试使用负数lookarounds

(?i)(?<![a-z])a(?![a-z])

See this demo at regex101-使用(?i)flag进行 * 无大小写 * 匹配:[a-z][a-zA-Z]

import regex as re
str = re.sub(fr"\b(?i:{'|'.join(words)})\b(*SKIP)(*F)|a", "_", str)

Another demo at regex101或查看位于www.example.com的Python演示tio.run
| alternation左侧的内容将被跳过,右侧的内容将被匹配。iignorecase-flag\bword boundaries用于(?:非捕获组)中的单词。

tzcvj98z

tzcvj98z2#

我认为你在寻找的是世界的边界:
下面的正则表达式只匹配位于两个世界边界内或后面有数字的a:

(?<=\d)a\b|\ba\b

https://regex101.com/r/7IfinZ/1

of1yzvn4

of1yzvn43#

此正则表达式主要用于匹配变量,但排除某些单词:

[a-z]++(?<!lag|pctrange|max)

https://regex101.com/r/zBHPQu/1
在这种情况下,使这个正则表达式工作的是所有量词(“++”),它尽可能多地匹配[a-z]模式。

相关问题