regex 替换三个破折号,但仅当同一行中跟随有重要字符时

9cbw7uwe  于 2023-05-19  发布在  其他
关注(0)|答案(1)|浏览(186)

在多行文本中,我想将三重破折号---替换为X。一行中必须有三个虚线,而不是两个或四个。另一个限制:如果---是行中的最后一个字符(可能的尾随空格除外),则不要替换它。
到目前为止,我得到了

import re

text1 = "a---b"
text2 = "a\n  --- \nb"

for text in [text1, text2]:
    print(repr(re.sub("(?<!-)---(?!-)", "X", text)))
'aXb'
'a\n  X \nb'

具有负向前看/向后看。我想要

'aXb'
'a\n  --- \nb'

但是,如何实现重要字符必须遵循---的规则?

cyvaqqii

cyvaqqii1#

您可以Assert左边是不带换行符的可选空格字符,后跟一个不是连字符的非空格字符

(?<!-)---(?=[^\S\n]*[^-\s])

Regex demo

for text in [text1, text2]:
    print(repr(re.sub(r"(?<!-)---(?=[^\S\n]*[^-\s])", "X", text)))

输出

'aXb'
'a\n  --- \nb'

或者你可以Assert没有换行的尾随空格直到字符串的结尾:

(?<!-)---(?!-|[^\S\n]*$)

Regex demo

for text in [text1, text2]:
    print(repr(re.sub(r"(?m)(?<!-)---(?=[^\S\n]*[^-\s])", "X", text)))

输出

'aXb'
'a\n  --- \nb'

相关问题