【问题标题】:Python regular expression not returning all groupsPython正则表达式不返回所有组
【发布时间】:2017-09-28 08:39:10
【问题描述】:

我有一个这样的字符串:

<hello<world<1 \< 2>,表示三个字符串"hello", "world", "1 < 2"的列表。我希望我的正则表达式能够匹配("hello", "world", "1 \< 2")。 (我将在稍后的评估中删除反斜杠)。我正在使用以下正则表达式来匹配文本:

r"(?:<((?:[^<>]|\\.)*))+>"

按照我的理解,它至少匹配一个(&lt; 后面有任意数量的非&lt;&gt;\anything),然后是结束&gt;,但结果并不表明。使用re.match(..., ...).groups(),我得到以下信息:

>>> import re
>>> re.match(r"(?:<((?:[^<>]|\\.)*))+>", r"<hello<world<1 \< 2>").groups()
<<< (' 2',)
>>> re.match(r"(?:<((?:[^<>]|\\.)*))+>", r"<hello<world<1 \< 2>").group(0)
<<< '<hello<world<1 \\< 2>'

令人困惑的是group(0) 甚至不在groups() 中,而且似乎其余的子字符串不在group(...) 中。我的正则表达式或方法有问题,我应该如何解决?

需要明确的是,我正在使用正则表达式为高尔夫语言构建词法分析器,因此将其替换为逐字符词法分析器会很不方便,因为我已经有了正则表达式词法分析器和大部分表达式集向上。我想知道是否可以使用纯正则表达式解决方案。

【问题讨论】:

  • &lt;分割怎么样? re.split(r"(?&lt;!\\)&lt;", r"&lt;hello&lt;world&lt;1 \&lt; 2&gt;")
  • @Psidom 不适用于反斜杠 &lt;... 虽然我可以尝试在它之前对非反斜杠使用非捕获匹配。我试试,谢谢!
  • @Psidom 嘿,实际上效果很好。谢谢!您可以发布答案,以便我支持您的方法吗?
  • 哪一个有效?如果您不想在\&lt; 上拆分,我想普通拆分是行不通的。
  • @Psidom 我在比赛中设法做到了re.split(r"(?=[^\\])&lt;", text),但是你提供的那个对我的目的很有效;谢谢!

标签: python regex


【解决方案1】:

你可以试试这个:

s = "<hello<world<1 \< 2>"
import re
l = [i for i in re.split("\<(?!\s\d)|\>", s) if i]

输出:

['hello', 'world', '1 \\< 2']

【讨论】:

  • 这个答案的小问题是&lt;&lt;&gt; 应该给["", ""]。而不是if i,我可能只会做re.split("...", s)[1:-1]
  • @HyperNeutrino 我不确定我是否了解该问题的背景。您能否发布包含&lt;&lt;&gt; 的字符串以及您想要的输出是什么?
  • 不喜欢你的方法会删除所有空字符串(开头和结尾的那些)但是如果我设置s = "&lt;&lt;&gt;",我希望l = ["", ""] 而你的答案会给[],因为空字符串被删除。
  • @HyperNeutrino 您可以通过检查 [] 来发挥您的优势,如果确实找到它,则继续处理将处理空语句的词法分析器部分。
  • 我不确定你所说的词法分析器中将处理空语句的部分是什么意思......用l = re.split("\&lt;(?!\s\d)|\&gt;", s)[1:-1] 替换你的最后一行确实正是我想要的......跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-15
  • 2021-10-12
  • 2018-02-18
  • 2011-09-28
  • 2020-12-02
相关资源
最近更新 更多