难以将单字母编程语言与正则表达式匹配

时间:2014-01-23 06:46:38

标签: python regex

我试图解析一些文本,用正则表达式搜索不同的编程语言名称,如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

3 个答案:

答案 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的更新示例

http://regex101.com/r/zV6aR3

    [^(目标)] \ W(c)中\ W

以下是使用示例字符串在regex101.com上的实现:

http://regex101.com/r/zS3uK6