【发布时间】:2011-06-19 08:06:01
【问题描述】:
我想检查较大的符号是否在小于符号的前面。 我真正需要的是检查 > 和 <.> 之间有多个由空格分隔的单词
例如:
<a v >
应该能找到,因为里面的“词”不止一个
还有这个:
< a >
不应该
这是我的python代码
text = '<a > b'
if re.search('(?<!\<)[a-zA-Z0-9_ ]+>',text): # search for '>'
print "found a match"
对于此文本,我不希望它匹配,因为之前有一个小于号。 但它确实找到了匹配项。 Negative Lookbehind 似乎不起作用。
解决方案(种类): 这也可以找到前面没有大于符号的小于符号
match = re.search('<?[a-zA-Z0-9_ ]+>',text)
if ((match) and (match.group(0)[0] != '<')):
print "found >"
match = re.search('<[a-zA-Z0-9_ ]+>?',text)
if ((match) and (match.group(0)[len(match.group(0))-1] != '>')):
print "found <"
感谢 homson_matt 的解决方案。
更好的解决方案:
通过在查找更大和更小的符号之前替换导致问题的字符串。
# replace all templates from source hunk ( <TEMPLATE> )
srcString = re.sub("<[ ]*[a-zA-Z0-9_\*:/\.]+[ ]*>", "TEMPLATE", srcString)
if re.search('[a-zA-Z0-9_ )]>',srcString): # search for '>'
return True
if re.search('<[a-zA-Z0-9_ (]',srcString): # search for '<'
return True
【问题讨论】:
-
search搜索字符串中表达式匹配的位置。 ` >` 匹配。您是否只想验证您的文本中没有< >序列? -
是的,但是像这样的序列:'x 5' 很好很艰难
-
如果它们之间只有一个单词,它不应该找到它,如果超过一个单词它应该找到它
-
虽然这不能解决问题,但请注意
'(?<!\<)[a-zA-Z0-9_ ]+>'模式应该是re.search('(?!<\<)[a-zA-Z0-9_ ]+>',text),即!字符位于<字符之前。 -
@ΤZΩΤZΙΟΥ:不,
(?<!\<)是正确的。唯一的问题是不必要的反斜杠,但这并没有伤害任何东西。(?!<\<)是<<的否定 lookahead。
标签: python regex pattern-matching