使用正则表达式从字符串中删除部分
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()
我希望这对你有用,但我相信你已经起诉了其他人的答案。
我有一个这样的字符串列表:
['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()
我希望这对你有用,但我相信你已经起诉了其他人的答案。