【问题标题】:pattern matching check if greater than symbol is not preceded by smaller than symbol模式匹配检查是否大于符号前面没有小于符号
【发布时间】: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 搜索字符串中表达式匹配的位置。 ` >` 匹配。您是否只想验证您的文本中没有&lt; &gt; 序列?
  • 是的,但是像这样的序列:'x 5' 很好很艰难
  • 如果它们之间只有一个单词,它不应该找到它,如果超过一个单词它应该找到它
  • 虽然这不能解决问题,但请注意'(?&lt;!\&lt;)[a-zA-Z0-9_ ]+&gt;' 模式应该是re.search('(?!&lt;\&lt;)[a-zA-Z0-9_ ]+&gt;',text),即! 字符位于&lt; 字符之前。
  • @ΤZΩΤZΙΟΥ:不,(?&lt;!\&lt;) 是正确的。唯一的问题是不必要的反斜杠,但这并没有伤害任何东西。 (?!&lt;\&lt;)&lt;&lt; 的否定 lookahead

标签: python regex pattern-matching


【解决方案1】:

匹配是:a &gt;。本节完美匹配您的正则表达式 - 它不是以 。

您是否要匹配整个字符串?如果是,请尝试使用 re.match 而不是 re.search

或者您可能想尝试此代码。它搜索可能以

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

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

【讨论】:

  • 是的,这个很不错。顺便说一句,我如何检查字符串是否以'>'符号结尾
  • 如果开头有 ,我如何确保只签入当前行
  • 匹配是 'a &gt;' 只是因为 yossi 输入了错误的否定后向断言。如果正确输入为'(?!&lt;',则匹配为' &gt;'
【解决方案2】:

我想这就是你要找的东西:

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

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

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

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

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

【讨论】:

  • 谢谢,但即使只有这样一个,我也需要它来找到:x> 5
  • 您是否尝试使用正则表达式解析布尔表达式?
  • 我只是想看看他们是否在那里。并忽略模板(C++)
猜你喜欢
  • 1970-01-01
  • 2018-11-22
  • 1970-01-01
  • 2015-06-06
  • 2014-01-11
  • 1970-01-01
  • 2015-01-15
  • 2018-03-15
  • 2012-09-17
相关资源
最近更新 更多