提取数字的第一个出现和文件名的最后一个单词

时间:2018-10-26 18:05:29

标签: regex python-3.x

我有一个这样的文件名列表,

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

如何更改我的代码?任何建议都很棒!

(注意:如果有一种方法可以将所有字母都大写,然后再进行正则表达式,那将会很棒)

1 个答案:

答案 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']