gpt4 book ai didi

python - 最后一场比赛结束的 anchor

转载 作者:行者123 更新时间:2023-11-28 17:32:24 24 4
gpt4 key购买 nike

正在处理 this answer我偶然发现了 Python 的重复正则表达式异常。

假设我得到一个 CSV 字符串,其中包含任意数量的带引号和不带引号的元素:

21, 2, '23.5R25 ETADT', 'description, with a comma'

我想用 '\t' 替换所有 ',' 的外部引号。所以我想要一个输出:

21\t2\t'23.5R25 ETADT'\t'description, with a comma'

由于字符串中自然会有多个匹配项,因此我将使用 g 正则表达式修饰符。我将使用的正则表达式将匹配引号外的字符或后跟 ',' 的引号字符串:

('[^']*'|[^',]*),\s*

我将替换为:

\1\t

现在的问题是正则表达式是搜索而不是匹配,所以它可以选择跳过字符直到它可以匹配。所以我得到的不是我想要的输出:

21\t2\t'23.5R25 ETADT'\t'description\twith a comma'

您可以在此处查看此行为的实例:https://regex101.com/r/sG9hT3/2

问。有没有一种方法可以锚定 g 修改后的正则表达式以在上一个匹配项之后的字符处开始匹配?


对于那些熟悉 Perl 强大的正则表达式的人来说,Perl 提供了 \G .这允许我们检索最后一个匹配位置的结尾。所以在 Perl 中我可以用正则表达式完成我所要求的:

\G('[^']*'|[^',]*),\s*

这会在最终引用的元素中造成不匹配。因为不是让正则表达式实现找到正则表达式与 \G 匹配的点,而是强制它从 第一个 字符开始匹配:

'description, with a comma'

最佳答案

您可以将以下正则表达式与 re.search 一起使用:

,?\s*([^',]*(?:'[^']*'[^',]*)*)

参见 regex demo (我将其更改为 ,?[ ]*([^',\n]*(?:'[^'\n]*'[^',\n]*)*) 因为这是一个多行演示)

在这里,正则表达式匹配(在单词的正则表达式含义中)...

  • ,? - 1 或 0 个逗号
  • \s* - 0 个或更多空格
  • ([^',]*(?:'[^']*'[^',]*)*) - 第 1 组存储捕获的文本,包含...
    • [^',]* - 除了 ,'
    • 之外的 0 个或多个字符
    • (?:'[^']*'[^',]*)* - 0 个或多个 ...
      • '[^']*' - 类似 'string' 的不包含撇号的子字符串
      • [^',]* - 除了 ,' 之外的 0 个或多个字符。

如果您想使用 re.match 并将捕获的文本存储在捕获组中,这是不可能的,因为 Python 正则表达式引擎不会像 .NET 正则表达式引擎那样将所有捕获存储在堆栈中与 CaptureCollection 一起执行。

此外,Python 正则表达式不支持 \G 运算符,因此您不能在此处成功匹配的末尾锚定任何子模式。

作为替代方案/解决方法,您可以使用以下 Python 代码返回连续的匹配项,然后返回字符串的其余部分:

import re

def successive_matches(pattern,text,pos=0):
ptrn = re.compile(pattern)
match = ptrn.match(text,pos)
while match:
yield match.group()
if match.end() == pos:
break
pos = match.end()
match = ptrn.match(text,pos)
if pos < len(text) - 1:
yield text[pos:]

for matched_text in successive_matches(r"('[^']*'|[^',]*),\s*","21, 2, '23.5R25 ETADT', 'description, with a comma'"):
print matched_text

参见 IDEONE demo ,输出为

21, 
2,
'23.5R25 ETADT',
'description, with a comma'

关于python - 最后一场比赛结束的 anchor ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33414028/

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