gpt4 book ai didi

python - 如何防止正则表达式匹配单词的子字符串?

转载 作者:行者123 更新时间:2023-12-02 18:04:46 24 4
gpt4 key购买 nike

我在 python 中有一个正则表达式,我想防止匹配子字符串。我想在开头添加'@'一些带有字母数字和_字符以及4到15个字符的单词。但它匹配较大单词的子串。我有这个方法:

def add_atsign(sents):
for i, sent in enumerate(sents):
sents[i] = re.sub(r'([a-zA-Z0-9_]{4,15})', r'@\1', str(sent))
return sents

例子是:

mylist = list()
mylist.append("ali_s ali_t ali_u aabs:/t.co/kMMALke2l9")
add_atsign(mylist)

答案是:

['@ali_s @ali_t @ali_u @aabs:/t.co/@kMMALke2l9']

如您所见,它将“@”放在“aabs”和“kMMALke2l9”的开头。这是错误的。我尝试按以下方式编辑代码:

def add_atsign(sents):
for i, sent in enumerate(sents):
sents[i] = re.sub(r'((^|\s)[a-zA-Z0-9_]{4,15}(\s|$))', r'@\1', str(sent))
return sents

但是结果会变成这样:

['@ali_s ali_t@ ali_u aabs:/t.co/kMMALke2l9']

如您所见,它有错误的替换。我期望的正确结果是:

"@ali_s @ali_t @ali_u aabs:/t.co/kMMALke2l9"

有人能帮忙吗?谢谢

最佳答案

这是一个非常有趣的问题。如果我没理解错的话,问题是你想用空格分隔字符串,然后只在整个单词匹配时才进行替换,而不是捕获子字符串。

我认为最好的方法是先按空格分隔,然后向您的正则表达式添加仅捕获整个字符串的断言:

def add_atsign(sents):
new_list = []
for string in sents:
new_list.append(' '.join(re.sub(r'^([a-zA-Z0-9_]{4,15})$', r'@\1', w)
for w in string.split()))
return new_list

mylist = ["ali_s ali_t ali_u aabs:/t.co/kMMALke2l9"]
add_atsign(mylist)
>
['@ali_s @ali_t @ali_u aabs:/t.co/kMMALke2l9']

即,我们拆分,然后仅当整个单词匹配时才替换,然后重新加入。

顺便说一下,您的正则表达式可以简化为 r'^(\w{4,15})$':

def add_atsign(sents):
new_list = []
for string in sents:
new_list.append(' '.join(re.sub(r'^(\w{4,15})$', r'@\1', w)
for w in string.split()))
return new_list

关于python - 如何防止正则表达式匹配单词的子字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73556462/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com