Python中的单个正则表达式,用于交错文本的命名组

时间:2016-11-09 20:03:43

标签: python regex

我想在Python中创建一个正则表达式,从文件名中提取两个交错的文本部分作为命名组。下面给出了一个示例文件名:

CM00626141_H12.d4_T0001F003L01A02Z03C02.tif

我要提取的文件名部分包含在下划线之间,包含以下内容:

  • 大写字母:[A-H]
  • 零填充的两位数字:0112
  • 一段时间
  • 小写字母:[a-d]
  • 单个数字:14

对于上面的示例,我希望一个组('Row')包含H.d,另一个组('Column')包含12.4。但是,当文本被分开时,我不知道如何执行此操作。

编辑:我省略的约束:它需要一个正则表达式来处理字符串。我已经更新了文本/标题以反映这一点。

3 个答案:

答案 0 :(得分:1)

您可以使用re.findall()分两步执行此操作:

第1步:从模式后面的主字符串中提取子字符串:

>>> import re

>>> my_file = 'CM00626141_H12.d4_T0001F003L01A02Z03C02.tif'
>>> my_content = re.findall(r'_([A-H])(0[0-9]|1[0-2])\.([a-d])([1-4])_', my_file)
# where content of my_content is: [('H', '12', 'd', '4')]

第2步:加入元组以获取rowcolumn的值:

>>> row = ".".join(my_content[0][::2])
>>> row
'H.d'

>>> column = ".".join(my_content[0][1::2])
>>> column
'12.4'

答案 1 :(得分:1)

正则表达式捕获组(无论是编号还是命名)实际上并不捕获文本 - 它们捕获原始文本中的开始/结束索引。因此,他们不可能捕获不连续的文本。在这里做的最好的事情可能是有四个独立的组,并手动将它们组合成两个所需的值。

答案 2 :(得分:0)

我不相信有任何方法可以在两个命名的捕获组和一个正则表达式调用中捕获您想要的所有内容。我看到的最直接的方法是执行以下操作:

>>> import re
>>> source = 'CM00626141_H12.d4_T0001F003L01A02Z03C02.tif'
>>> match = re.search(r'_([A-H])(0[0-9]|1[0-2])\.([a-d])([1-4])_', source)
>>> row, column = '.'.join(match.groups()[0::2]), '.'.join(match.groups()[1::2])
>>> row
'H.d'
>>> column
'12.4'

或者,您可能会发现在正则表达式中几乎完全处理解析更具吸引力:

>>> row, column = re.sub(
        r'^.*_([A-H])(0[0-9]|1[0-2])\.([a-d])([1-4])_.*$',
        r'\1.\3,\2.\4',
        source).split(',')
>>> row, column
('H.d', '12.4')