gpt4 book ai didi

python - 合并已编译的 Python 正则表达式

转载 作者:太空狗 更新时间:2023-10-29 18:09:16 25 4
gpt4 key购买 nike

Python 中是否有任何机制可以组合已编译的正则表达式?

我知道可以通过从现有模式对象中提取普通旧字符串 .pattern 属性来编译新表达式。但这在几个方面都失败了。例如:

import re

first = re.compile(r"(hello?\s*)")

# one-two-three or one/two/three - but not one-two/three or one/two-three
second = re.compile(r"one(?P<r1>[-/])two(?P=r1)three", re.IGNORECASE)

# Incorrect - back-reference \1 would refer to the wrong capturing group now,
# and we get an error "redefinition of group name 'r1' as group 3; was
# group 2 at position 47" for the `(?P)` group.
# Result is also now case-sensitive, unlike 'second' which is IGNORECASE
both = re.compile(first.pattern + second.pattern + second.pattern)

我正在寻找的结果在 Perl 中是可以实现的:

$first = qr{(hello?\s*)};

# one-two-three or one/two/three - but not one-two/three or one/two-three
$second = qr{one([-/])two\g{-1}three}i;

$both = qr{$first$second$second};

测试显示结果:

test($second, "...one-two-three...");                   # Matches
test($both, "...hello one-two-THREEone-two-three..."); # Matches
test($both, "...hellone/Two/ThreeONE-TWO-THREE..."); # Matches
test($both, "...HELLO one/Two/ThreeONE-TWO-THREE..."); # No match

sub test {
my ($pat, $str) = @_;
print $str =~ $pat ? "Matches\n" : "No match\n";
}

是否有某个库可以在 Python 中实现此用例?或者我在某处缺少的内置功能?

(注意 - 上面的 Perl 正则表达式中一个非常有用的特性是 \g{-1},它明确地引用了紧接在前的捕获组,因此没有类型的冲突当我尝试编译组合表达式时,Python 会提示。我在 Python 世界的任何地方都没有看到,不确定是否有我没有想到的替代方法。)

最佳答案

肯,这是一个有趣的问题。我同意你的看法,Perl 解决方案非常巧妙。我想到了一些东西,但它不是那么优雅。也许它会给你一些想法,让你进一步探索使用 Python 的解决方案。这个想法是使用 Python re 方法模拟连接。

first = re.compile(r"(hello?\s*)")
second = re.compile(r"one(?P<r1>[-/])two(?P=r1)three", re.IGNORECASE)

str="...hello one-two-THREEone/two/three..."
#str="...hellone/Two/ThreeONE-TWO-THREE..."
if re.search(first,str):
first_end_pos = re.search(first,str).end()
if re.match(second,str[first_end_pos:]):
second_end_pos = re.match(second,str[first_end_pos:]).end() + first_end_pos
if re.match(second,str[second_end_pos:]):
print ('Matches')

它适用于大多数情况,但不适用于以下情况:

...hellone/Two/ThreeONE-TWO-THREE...

所以,是的,我承认这不是您问题的完整解决方案。希望这会有所帮助。

关于python - 合并已编译的 Python 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48957035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com