使用正则表达式从字符串中删除部分

Remove parts from a string using a regular expression

我有一个这样的字符串列表:

['NN.KTXS/KTXE.FOO BAR.STACK.OVERFLOW', 'NN.WFXL.Harlan KY.Harlan.KY', 'NN.WRGB/WCWN.Los Angeles CA.Burbank.CA', 'NN.KVII/KVIH.Denver.Denver.CO', 'NN.KEYE.Denver.Denver.CO']

我正在尝试使用正则表达式去除 NN.(包括那个)和第二个 . 之间的文本部分,因此列表看起来像:

['FOO BAR.STACK.OVERFLOW', 'Harlan KY.Harlan.KY', 'Los Angeles CA.Burbank.CA', 'Denver.Denver.CO', 'Denver.Denver.CO']

我已经尝试使用 regex101 来构建和测试它,使用:"NN\.[A-z]{?}\." 但我没有得到任何匹配项。

如何构建正则表达式?

NN\.([\w\/]+)\.

根据您的需要进行调整。 然后你得到第一个也是唯一一个组。

你快到了。

首先将 {?} 替换为 +

{?表示匹配{0次或1次。那么 } 就是字面上的匹配。

这将匹配 'NN.WFXL.Harlan KY.Harlan.KY' 中的 NN.WFXL'NN.KEYE.Denver.Denver.CO' 中的 NN.KEYE

要匹配其他人的相同部分,请扩展您的字符集以包含 /

[A-z] 变为 [A-z\/]

最后,更深思熟虑... [A-z] 匹配以下字符:

ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz

也许这是一个有意的选择,但如果您只想匹配不区分大小写的字母,请使用 [A-Za-z]

>>> x = ['NN.KTXS/KTXE.FOO BAR.STACK.OVERFLOW', 'NN.WFXL.Harlan KY.Harlan.KY', 'NN.WRGB/WCWN.Los Angeles CA.Burbank.CA', 'NN.KVII/KVIH.Denver.Denver.CO', 'NN.KEYE.Denver.Denver.CO']
>>> y = ['.'.join(val.split('.')[2:]) for val in x]
>>> y
['FOO BAR.STACK.OVERFLOW', 'Harlan KY.Harlan.KY', 'Los Angeles CA.Burbank.CA', 'Denver.Denver.CO', 'Denver.Denver.CO']

此模式 [A-z]{?} 匹配范围 A-z (即 not the same 作为 [A-Za-z] 然后是可选的 {}

要匹配从 NN. 到下一个点,您可以使用否定字符 class [^.]* 匹配除点以外的任何字符:

NN\.[^.]*\.

替换为空字符串。

看到一个regex demo

import re

lst = ['NN.KTXS/KTXE.FOO BAR.STACK.OVERFLOW', 'NN.WFXL.Harlan KY.Harlan.KY', 'NN.WRGB/WCWN.Los Angeles CA.Burbank.CA', 'NN.KVII/KVIH.Denver.Denver.CO', 'NN.KEYE.Denver.Denver.CO']
print([re.sub(r"NN\.[^.]*\.", "", s) for s in lst])

输出

['FOO BAR.STACK.OVERFLOW', 'Harlan KY.Harlan.KY', 'Los Angeles CA.Burbank.CA', 'Denver.Denver.CO', 'Denver.Denver.CO']

所有这些其他答案对我来说都太复杂了,所以我会这样做:

list = ['NN.KTXS/KTXE.FOO BAR.STACK.OVERFLOW', 'NN.WFXL.Harlan KY.Harlan.KY', 'NN.WRGB/WCWN.Los Angeles CA.Burbank.CA', 'NN.KVII/KVIH.Denver.Denver.CO', 'NN.KEYE.Denver.Denver.CO']

replacement []
for i, e in enumerate(list):
    elist = e.split(".")
    newvalue = ""
    for i2 in elist[2:len(elist)]: newvalue += i2
    replacement.append(newvalue)
list = replacement.copy()

我希望这对你有用,但我相信你已经起诉了其他人的答案。