使用 python re 替换定界符后单词的每个符号

问题描述 投票:0回答:3

我想用

-
替换
*
之后的每个单词符号。

例如:

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

在 TS 正则表达式中,可以使用

(?<=-\w*)\w
和替换
*
来完成。但是默认的 python 正则表达式引擎需要固定宽度的 lookbehinds。

我能做的最好的成像就是使用

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

并重复 lookbehing 一些预定的次数,但它似乎不是很可持续或优雅。

是否可以使用默认

re
模块来完成具有更优雅模式的任务?

测试演示这里.

附言我知道存在支持可变长度后视的替代正则表达式引擎,但如果可能的话,我想暂时使用默认引擎。

python regex regex-lookarounds positive-lookbehind
3个回答
1
投票

我认为你不能用 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

正则表达式演示


1
投票

您可以捕获

-
之后的所有单词字符,并将回调传递给
re.sub
,用相同长度的星号字符串替换匹配项。

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

1
投票

你可以在 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
,它与所需的结果相匹配。

© www.soinside.com 2019 - 2024. All rights reserved.