我试图解析一些文本,用正则表达式搜索不同的编程语言名称,如python,java等。不幸的是,正则表达式不是我完全熟悉的东西,但找到多个字母的语言所需的匹配非常容易。但是,当试图匹配单字母语言时,我遇到了一些困难。例如,这是我的C语言模式:
'\Wc[^\+#\w](\W|$)|\Wc$'
除了它也匹配objective-c之外,它的效果很好。如果'c'前面有'objective-',有没有办法编写一个不匹配的模式?我也在python中编写我的程序,所以如果有更好的方法,如果有人指出这一点,我将不胜感激。
不应匹配的字符串示例,但是:
objective-d – alternative or supplement to objective-c
compile clojure to objective-c
它匹配我测试过的所有其他情况,除非在字符串
中存在objective-c答案 0 :(得分:1)
re.compile(r'(?<!objective-)\bc\b',re.I)
此表达式不匹配:
objective-d – alternative or supplement to objective-c
compile clojure to objective-c
并确实匹配:
compile with c
c expression
compile c program
contains a c struct
strict C syntax
(?<!...)
是negative lookbehind assertion,意味着断言不是匹配的一部分,但要求匹配不在该表达式之前。
答案 1 :(得分:0)
我想你有一个包含所有语言名称的列表。
这是你想要的吗?
>>> txt = "objective-d – alternative or supplement to objective-c but not c or java,python"
>>> lang_names.sort(key=len, reverse=True)
>>> lang_names
['objective-c', 'python', 'c']
>>> regexp = re.compile("(?:^|\W)(" + "|".join(lang_names) + ")(?:\W|$)")
>>> matches = regexp.finditer(txt)
>>> for m in matches:
... print m.group(1)
...
objective-c
c
python
答案 2 :(得分:0)
正如mojo和M42所提到的,使用负面的背后隐藏。
这是更新的正则表达式:
(?<!objective-)(c)\W
和regex101的更新示例
[^(目标)] \ W(c)中\ W
以下是使用示例字符串在regex101.com上的实现: