regex 使用python re替换delimiter后单词的每个符号

nr9pn0ug  于 2023-04-13  发布在  Python
关注(0)|答案(2)|浏览(109)

我想用*替换-后面的每个单词符号。
例如:

asd-wqe ffvrf    =>    asd-*** ffvrf

在TS正则表达式中,可以使用(?<=-\w*)\w和替换*来完成。但默认的Python正则表达式引擎需要固定宽度的lookbehind。
我能做的最好的成像就是

(?:(?<=-)|(?<=-\w)|(?<=-\w{2}))\w

并重复看一些预定的大次数,但它似乎不是很可持续或优雅。
有没有可能使用默认的re模块来完成这样一个任务,并使用一些更优雅的模式?
测试here的演示。
P.S.我知道有其他的正则表达式引擎,支持可变长度的lookbehind,但是如果可能的话,我想暂时坚持使用默认的。

bgtovc5b

bgtovc5b1#

我认为你不能用Python re来做这件事,因为你想匹配一个字符,知道左边是-,后面是可选的单词字符。
我会这样写,并使用回调函数,然后获取替换*字符的匹配长度

import re

strings = [
    "asd-wqe ffvrf",
    "asd-ss sd",
    "a-word",
    "a-verylongword",
    "an-extremelyverylongword"
]
pattern = r"(?<=-)\w+"
for s in strings:
    print(re.sub(pattern, lambda x: len(x.group()) * "*", s))

输出

asd-*** ffvrf
asd-** sd
a-****
a-************
an-*********************

请参见python demo
在lookbehindAssert中使用量词的替代方法是使用\G锚(Python re也不支持)

(?:-|\G(?!^))\K\w

Regex demo

cx6n0qe3

cx6n0qe32#

您可以捕获-之后的所有单词字符,并向re.sub传递一个回调函数,该回调函数将匹配替换为相同长度的星号字符串。

s = 'asd-wqe ffvrf'
res = re.sub(r'(?<=-)\w+', lambda m: '*' * len(m.group()), s)

相关问题