【问题标题】:How to implement Lua frontier pattern in Python?如何在 Python 中实现 Lua 前沿模式?
【发布时间】:2017-12-21 11:41:38
【问题描述】:

如何实现Luafrontier pattern

%f[set]匹配任意位置的空字符串,使得下一个字符属于set,前一个字符不属于set

在 Python 正则表达式中?

【问题讨论】:

  • 您能否进一步扩展您的解释?我对 Lua 不是很熟悉,如果没有更多信息,我无法提供等效的 Python 正则表达式。如果您针对您的问题创建了一个minimal reproducible example 并展示了您尝试过的内容,这也可能有助于我们了解您想要什么。
  • 您是否有要匹配的特定字符串?正如我上面所说,你能提供一个minimal reproducible example吗?
  • 嗨@ChristianDean 我已经添加了一个 Lua wiki 的链接,它解释了一些案例。我想找到一个统一的替代方案,而不是针对特定情况的解决方案。
  • 您最好指定您拥有的场景。 Python 中没有完全等价的。

标签: python regex lua


【解决方案1】:

您可能正在寻找正则表达式中的“前瞻”模式。例如:

import re

s = 'there is 1more 2go 3fold'
#     
pat = re.compile('(?=[12])')
for m in pat.finditer(s):
    print(m.start())

产量:

9
15

来自the docs

(?=...) 匹配 if ... 匹配下一个,但不消耗任何字符串。 这称为前瞻断言。例如,Isaac (?=Asimov) 将匹配 'Isaac' 仅当它后面跟着 'Asimov' 时。

与其中一个 cmets 相比,前瞻表达式不限于“固定长度字符串”,至少就我理解该描述而言。例如:

s = 'there is 1Fmore 1Gother 21go 3fold 3slambam'

pat = re.compile('(?=(1F|2|3sl.[mn]))')
for m in pat.finditer(s):
    print(m.start(), repr(s[m.start():]))

产量:

9 '1Fmore 1Gother 21go 3fold 3slambam'
24 '21go 3fold 3slambam'
35 '3slambam'

这里的前瞻是一个相当广泛的不同长度的子模式,并带有嵌入的通配符和它自己的子表达式。

【讨论】:

  • (?=...)在Python re中只支持定长字符串,而边界模式可以用完整的模式,不能轻易转换。
  • 我不理解批评。添加了使用可变长度模式作为前瞻的更新示例。如果您提供更具体的示例来说明您要匹配的内容,我会尝试翻译。从您提供的 Lua 示例中我可以看出,前瞻是边界模式的非常接近的模拟。
  • @JonathanEunice Frontier 模式在 Lua 中既可以用作前瞻,也可以用作后瞻。
  • 您一直在笼统地描述这种模式。您链接到的文档仅提供了 一个 正在使用的“边界模式”示例,并且可以使用re.findall(r'\b[A-Z]+\b', "THE (QUICK) brOWN FOx JUMPS") 在 Python 中轻松完成匹配的内容。除非你能提供一个例子来说明 re 的前瞻和后瞻是如何不足的,否则我认为这种前沿模式不会给派对带来任何新的东西。
猜你喜欢
  • 2013-11-10
  • 1970-01-01
  • 1970-01-01
  • 2013-06-27
  • 2015-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
相关资源
最近更新 更多