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

4 投票
2 回答
6811 浏览
提问于 2025-04-16 19:51

我想检查一下大于号前面是否有小于号。其实我想确认的是,在大于号(>)和小于号(<)之间是否有多个用空格分开的“词”。

举个例子:

<a v >

这个应该被找到,因为里面有多个“词”。

而这个:

< 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

2 个回答

2

我觉得这就是你想要的内容:

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

\w+ 用来匹配第一个单词,然后 (?:\s+\w+)+ 用来匹配一个或多个额外的单词,这些单词之间用空格隔开。如果你不想让匹配跨越多行,可以把 \s 改成一个普通的空格:

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

...或者改成只匹配水平空白的字符类(也就是 TAB 或空格字符):

r'<[ \t]*\w+(?:[ \t]+\w+)+[ \t]*>'
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

撰写回答