【问题标题】:String substitution using regex in Python with overlapping pattern在 Python 中使用具有重叠模式的正则表达式进行字符串替换
【发布时间】:2020-06-07 20:41:40
【问题描述】:

我正在尝试使用正则表达式查找 && 并使用 Python 将其替换为 and。 这是我的正则表达式:

r"(?=( && ))"

测试输入:x&& &&& && && x || | ||\|| x,预期输出:x&& &&& and and x or | ||\|| x。我的 Python 代码:

import re

input = "x&& &&& && && x || | ||\|| x"
result = re.sub(r"(?=( && ))", " and ", input)
print(result)

我的输出是:x&& &&& and && and && x || | ||\|| x。这实际上是有效的,但它不是替换它留下原始模式,只是在找到模式时添加我的替换字符串。这真是令人困惑。

【问题讨论】:

  • re.sub(r"(?<!\S)&&(?!\S)", "and", text)?您只有一个重叠的尾随空格。
  • 重叠可以通过前瞻来控制,但是您可以将重叠限制为单个结束字符,即[ ]&&(?=[ ])替换`和`这样endchar可以在需要时重复使用(重叠)相邻的`&&`。当然,您可以变得花哨,而且我非常棒,并且可以前后颠倒断言,但这取决于您
  • 这个网站上有数百个重叠的正则表达式示例,看起来有点,是吗?

标签: python regex


【解决方案1】:

正向前瞻内的捕获组可用于提取重叠模式。要替换它们,您实际上需要使用文本,环顾四周不会使用它们匹配的文本。

在这种情况下,您只有一个重叠的 尾随 空间,因此您可以使用以下两种方法中的任何一种:

text = re.sub(r"( )&&(?= )", r"\1and", text)

或者,如果您需要用任何空白字符替换任何前面或后面都没有的&&,请使用

text = re.sub(r"(?<!\S)&&(?!\S)", r"and", text)

注意inputPython builtin,您应该以不同的方式命名您的文本变量,例如text

【讨论】:

  • 非常感谢您的快速回复。澄清一下: re.sub(r"( )&&(?= )" 意味着 && 后面应该跟空格以匹配我们的模式,但是当替换完成时我们不会消耗这个空格。如何 r"\ 1and" 有效吗?我认为 '&&' 需要用 "and" 代替,对吗?
  • @AmacOS ( ) 是一个捕获组,\1 反向引用指的是这个组值。如果这是一个常规空间,你当然可以使用text = re.sub(r" &amp;&amp;(?= )", r" and", text)。如果您想使用 \s 而不是文字空间来匹配任何空格,我提供了一个反向引用解决方案。
【解决方案2】:

您的输出与您对问题的陈述一致(原文如此):

I am trying to find " && " and substitute it with " and "

由于输出不是您想要的,因此您的问题陈述肯定有问题。我相信你真的想要:

我正在尝试查找" &amp;&amp;" 后跟一个空格并将其替换为" and"

一旦你做对了,只需将其转换为正则表达式即可:

import re

s = 'x&& &&& && && x || | ||\|| x'
print re.sub(r' &&(?= )', ' and', s)
  #=> x&& &&& and and x || | ||\|| x

Demo

(?= ) 是一个正向前瞻,它断言匹配后跟一个空格。

猜你喜欢
  • 1970-01-01
  • 2015-04-30
  • 1970-01-01
  • 2019-11-12
  • 2023-03-16
  • 2022-10-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-07
相关资源
最近更新 更多