我有一个这样的文件名列表,
filenames = ['122 CHC Sep 2017.xlsx', '124 CHC Sep 2017 RFK.xlsx', '124 CHC Sep 2018 Trc.xlsx']
我想要数字的第一个出现和最后一个单词。
我的输出需要这样,
['122', '124 RFK', '124 Trc']
我尝试了以下
regex = re.compile(r'^\D*(\d+)([a-zA-Z]+)\.[a-zA-Z]+$')
[regex.findall(x) for x in filenames]
我得到了
[['122'],['124'], ['124']]
我尝试过
regex = re.compile(r'^\D*(\d+).*?([a-zA-Z]+)\.[a-zA-Z]+$')
[regex.findall(x) for x in filenames]
我得到了
[[], ['124', 'RFK'], ['124', 'Trc']]
这次我没有得到122
。
如何更改我的代码?任何建议都很棒!
(注意:如果有一种方法可以将所有字母都大写,然后再进行正则表达式,那将会很棒)
答案 0 :(得分:1)
您可以使用
^\D*(\d+)(?:.*?(\s*[a-zA-Z]+)|.*)\.[a-zA-Z]+$
请参见regex demo。
详细信息
^
-字符串的开头\D*
-0 +个非数字(\d+)
-第1组:一个或多个数字(?:.*?(\s*[a-zA-Z]+)|.*)
-两种选择之一:
.*?(\s*[a-zA-Z]+)
-任意0个以上的字符,后面尽可能少的是第1组,捕获0+个空白和1+个字母|
-或.*
-任意0个以上的字符,并且尽可能多\.
-点
-[a-zA-Z]+
-1个以上字母$
-字符串的结尾。下面是Python demo:
import re
filenames = ['122 CHC Sep 2017.xlsx', '124 CHC Sep 2017 RFK.xlsx', '124 CHC Sep 2018 Trc.xlsx']
rx = re.compile(r'^\D*(\d+)(?:.*?(\s*[a-zA-Z]+)|.*)\.[a-zA-Z]+$')
print([rx.sub(r'\1\2', x) for x in filenames])
# => ['122', '124 RFK', '124 Trc']