正则表达式在末尾修复(所有匹配项或无匹配项)为1

我试图解决.在最后只有一个字符串中。例如,

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

我有.*$Ruby 中的正则表达式,它将被替换为单个.,就像在这个演示中一样,它似乎没有按预期工作。我搜索过类似的帖子,我得到的最接近的是Python 中的这个答案,它暗示了以下内容,

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

但是,如果我.最后没有,它就会失败。所以,我已经试过像b.*$,因为在这里看到,但这未能对具有一定第三测试?在结束的。

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


预期输出:

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

回答

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

在替换中使用一个点。

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

解释

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

正则表达式演示| Python 演示

例如

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)

输出


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

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

正则表达式演示


以上是正则表达式在末尾修复(所有匹配项或无匹配项)为1的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>