gpt4 book ai didi

python - 正则表达式将结尾处的(所有匹配项或无匹配项)修复为 1

转载 作者:行者123 更新时间:2023-12-02 02:30:49 25 4
gpt4 key购买 nike

我正在尝试将末尾的 . 修复为字符串中仅有一个。例如,

line = "python...is...fun..."

我在 Ruby 中有正则表达式 \.*$,它将被单个 . 替换,如 this demo 中所示。 ,这似乎没有按预期工作。我搜索过类似的帖子,最接近的是 this answer在 Python 中,建议如下,

>>> text1 = 'python...is...fun...'
>>> new_text = re.sub(r"\.+$", ".", text1)
>>> 'python...is...fun.'

但是,如果最后没有 . ,它就会失败。所以,我尝试过像 \b\.*$,如 seen here ,但是在第三个测试中失败了,该测试的末尾有一些 ?

我的问题是,为什么 \.*$ 不匹配所有 .(尽管很贪婪)以及如何正确解决问题?


预期输出:

python...is...fun.
python...is...fun.
python...is...fun??.

最佳答案

您可以使用匹配 2 个或更多点的交替,或者断言直接左边的内容不是例如 ! 之一。 ?或一个点本身。

在替换中使用单个点。

(?:\.{2,}|(?<!\.))$

说明

  • (?:交替的非捕获组
    • \.{2,}匹配 2 个或更多点
    • |或者
    • (?<!\.)获取左边不是 . 的位置(您可以根据需要使用其他字符进行扩展)
  • )关闭非捕获组
  • $字符串结尾(如果后面不能有换行符,则使用 \Z)

Regex demo | Python demo

例如

import re 
strings = [
"python...is...fun...",
"python...is...fun",
"python...is...fun??"
]

for s in strings:
new_text = re.sub(r"(?:\.{2,}|(?<!\.))$", ".", s)
print(new_text)

输出

python...is...fun.
python...is...fun.
python...is...fun??.

如果空字符串不应被点替换,则可以使用正向lookbehind。

(?:\.{2,}|(?<=[^\s.]))$

Regex demo

关于python - 正则表达式将结尾处的(所有匹配项或无匹配项)修复为 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65062786/

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