2014-01-23 17 views
1

我想解析一些文本搜索不同的编程语言名称,如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

您能否提供一些更多的“语言名称”模式? – Tarzan

+0

你需要提供一个示例字符串,你的正则表达式应该工作,但它不会 –

+0

@Tarzan我不完全确定你在问什么,但是对于我用来匹配一种语言的所有其他模式,我需要做的只是用'\ W'围绕语言名称,比如'\ Wjava \ W' – Bryan

回答

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,这意味着断言不匹配的一部分,但要求该匹配不是由表达之前。

+0

谢谢mojo!这很有效 – Bryan

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 
0

如魔力和M42所提到的,使用负的回顾后发。

下面是更新正则表达式:

(?<!objective-)(c)\W 

和regex101

http://regex101.com/r/zV6aR3

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

更新的示例以下是您的示例字符串在regex101.com上的实现:

http://regex101.com/r/zS3uK6

+0

你认为'[^(objective)]'匹配了什么? – Toto

+0

它与字符串不匹配,前提是它包含一个非字母表,非数字字符,并带有一个以'objective'开头的C。所以它不会匹配Objective-C。 –

+0

恐怕你错了。 '[^(objective)]'匹配一个不是'('或'o'或'b' ...')'的字符。 – Toto

相关问题