我想用
-
替换*
之后的每个单词符号。
例如:
asd-wqe ffvrf => asd-*** ffvrf
在 TS 正则表达式中,可以使用
(?<=-\w*)\w
和替换 *
来完成。但是默认的 python 正则表达式引擎需要固定宽度的 lookbehinds。
我能做的最好的成像就是使用
(?:(?<=-)|(?<=-\w)|(?<=-\w{2}))\w
并重复 lookbehing 一些预定的次数,但它似乎不是很可持续或优雅。
是否可以使用默认
re
模块来完成具有更优雅模式的任务?
测试演示这里.
附言我知道存在支持可变长度后视的替代正则表达式引擎,但如果可能的话,我想暂时使用默认引擎。
我认为你不能用 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 演示。
lookbehind 断言中量词的替代方法是使用
\G
锚点(Python re 也不支持)
(?:-|\G(?!^))\K\w
您可以捕获
-
之后的所有单词字符,并将回调传递给re.sub
,用相同长度的星号字符串替换匹配项。
s = 'asd-wqe ffvrf'
res = re.sub(r'(?<=-)\w+', lambda m: '*' * len(m.group()), s)
你可以在 Python 的 re 模块中结合使用 lookbehind 和 capturing groups 来达到预期的结果,而无需指定固定的重复次数。
这是一个应该有效的正则表达式模式示例:
(?<=-)(\w|(?<=\w)-)*
此模式匹配任何单词字符
(\w)
或前面有连字符的连字符。捕获组 (\w|(?<=\w)-)
匹配单个单词字符或前面有单词字符的连字符。这允许模式匹配连续的连字符,但只替换第一个连字符之后的字符。
在Python中,可以使用
re.sub()
函数将匹配到的字符替换为星号:
import re
text = 'asd-wqe ffvrf'
result = re.sub(r'(?<=-)(\w|(?<=\w)-)*', lambda match: '*' * len(match.group()), text)
print(result)
# Output: asd-*** ffvrf
在此代码中,
re.sub()
函数采用三个参数:正则表达式模式、为每个匹配项生成替换字符串的函数以及要修改的输入字符串。
lambda 函数
lambda match: '*' * len(match.group())
生成一个替换字符串,该替换字符串由与匹配字符长度相同的星号组成。 match.group()
方法将匹配的字符作为字符串返回。
在示例输入
asd-wqe ffvrf
上运行此代码会产生输出 asd-*** ffvrf
,它与所需的结果相匹配。