模式匹配检查大于符号是否没有在小于符号之前出现。

3
我希望检查大于号是否在小于号之前。实际上我需要检查在 > 和 < 之间是否有超过一个空格分隔的单词。
例如:
<a v >

应该会被找到,因为里面有多个“word”

以及这个:

< a > 

不应该

这是我的Python代码

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

对于这段文本,我不希望它匹配,因为前面有一个小于号。 但它确实找到了匹配项。 负向后瞻 似乎无法正常工作。

解决方案(有点): 这也会找到没有大于号前缀的小于符号。

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 搜索字符串中与表达式匹配的位置。 > 匹配。您只是想验证文本中是否没有 < > 序列吗? - Felix Kling
是的,但像这样的序列:“x < 5 and y > 5”很好。 - yossi
如果它们之间只有一个单词,则不应找到它,如果大于一个单词,则应该。 - yossi
虽然这并没有解决问题,但请注意 '(?<!\<)[a-zA-Z0-9_ ]+>' 模式应该是 re.search('(?!<\<)[a-zA-Z0-9_ ]+>',text),即 ! 字符应该在 < 字符之前。 - tzot
1
@ΤΖΩΤΖΙΟΥ:不,(?<!\<)是正确的。唯一错误的是不必要的反斜杠,但这并不会有任何影响。(?!<\<)是对<<的负向前瞻 - Alan Moore
2个回答

4
匹配结果为:a >。这一部分完美地匹配了您的正则表达式——它不以<开头,然后有"a ",这与方括号中的内容匹配,最后是一个>。
如果您想匹配整个字符串,请尝试使用re.match而不是re.search
或者您可以尝试以下代码。它搜索可能以<开头的子字符串,然后决定它是否实际上是这样。
text = '<a > b'
match = re.search('<?[a-zA-Z0-9_ ]+>',text)

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

是的,这个还不错。顺便问一下,我该如何检查字符串是否不以“>”符号结尾? - yossi
我该如何确保只在当前行的开头检查是否有<符号。 - yossi
匹配结果是 'a >',只因为 Yossi 输入了错误的负向回顾后断言。如果正确输入为 '(?!<',那么匹配结果将是 ' >' - tzot

2

我想这就是您要找的内容:

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

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

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

...或者将它返回到仅包括水平空格(即制表符或空格字符)的字符类中:

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

谢谢,但我需要找到即使只有一个存在的情况,就像这样:x>5。 - yossi
你是否正在尝试使用正则表达式解析布尔表达式? - Alan Moore
我只想查找它们是否存在,忽略模板(C ++)。 - yossi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接