regex 如何使用re.sub()替换单词后缀,以及为什么我会得到“不支持的&操作数类型:'str'和'int'“

wlzqhblo  于 2023-08-08  发布在  其他
关注(0)|答案(2)|浏览(77)

如果我有一个文本主体,想用保留单词的其余部分来替换“ion”或“s”(所以如果单词是reflection,它应该输出reflect),我该怎么做?我试过:

new_llw = re.sub(r'[a-z]+ion', "", llw)
print(new_llw)

字符串
它取代了整个单词,我试着

if re.search(r'[a-z]+ion', "", llw) is True:
    re.sub('ion', '', llw)

print(llw)


这给了我一个错误:
TypeError:不支持&的操作数类型:'str'和'int'

cnjp1d6j

cnjp1d6j1#

TypeError: unsupported operand type(s) for &: 'str' and 'int'错误是由于您正在像使用re.sub一样使用re.search(r'[a-z]+ion', "", llw)re.search的第二个参数是输入字符串,它是空的,第三个参数是标志,它是用特定的正则表达式选项(如re.Are.I)设置的,可以表示按位掩码(re.A | re.I)。
现在,如果需要匹配ion作为单词中的后缀,可以使用

new_llw = re.sub(r'\Bion\b', '', llw)

字符串
在这里,\B匹配一个紧接在单词char(字母、数字或连接符标点符号,如_)之前的位置,然后ion匹配ion\b匹配一个位于字符串末尾或紧接在非单词char之后的位置。
要同时匹配s后缀,请执行以下操作:

new_llw = re.sub(r'\B(?:ion|s)\b', '', llw)


(?:...)是一个非捕获组。
参见regex demo

变化

如果只将单词视为字母序列,则可以使用

new_llw = re.sub(r'(?<=[a-zA-Z])(?:ion|s)\b', '', llw) # ASCII only version
new_llw = re.sub(r'(?<=[^\W\d_])(?:ion|s)\b', '', llw) # Any Unicode letters supported


在这里,(?<=[a-zA-Z])匹配紧接在ASCII字母前面的位置。

k5ifujac

k5ifujac2#

对于ion替换,您可以使用正向后查找:

inp = "reflection"
output = re.sub(r'(?<=\w)ion\b', '', inp)
print(output)  # reflect

字符串

相关问题