模式匹配检查大于符号前面是否小于符号

时间:2011-06-19 08:06:01

标签: python regex pattern-matching

我想检查更大的符号前面是否小于号。 我真正需要的是检查我>之间的空格分隔多个单词。和<。

例如:

<a v >

应该找到,因为

中有多个“单词”

和此:

< a > 

不应该

这是我的python代码

text = '<a > b'
if re.search('(?<!\<)[a-zA-Z0-9_ ]+>',text):   # search for '>'
   print "found a match"

对于这个文本,我不希望它匹配,因为之前有一个小于号。 但确实找到了匹配。 Negative Lookbehind似乎无法正常工作。

溶液(kindof): 这也发现小于符号前面没有大于符号

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

2 个答案:

答案 0 :(得分:4)

比赛是:a >。这部分完全匹配你的正则表达式 - 它不以&lt;开头,然后它有“a”,它与方括号中的位相匹配,然后有一个&gt;。

你想要匹配整个字符串吗?如果是,请尝试使用re.match代替re.search

或者您可能想尝试此代码。它搜索可能以&lt;开头的子字符串,然后判断它是否确实存在。

text = '<a > b'
match = re.search('<?[a-zA-Z0-9_ ]+>',text)

if ((match) and (match.group(0)[0] != '<')):
  # Match found

答案 1 :(得分:2)

我认为这就是你要找的东西:

r'<\s*\w+(?:\s+\w+)+\s*>'

\w+匹配第一个单词,然后(?:\s+\w+)+匹配一个或多个附加单词,由空格分隔。如果您不希望匹配跨越多行,则可以将\s更改为文字空间:

r'< *\w+(?: +\w+)+ *>'

...或仅用于水平空格的字符类(即TAB或空格字符):

r'<[ \t]*\w+(?:[ \t]+\w+)+[ \t]*>'