如何使用Python RegEx从字符串中提取数据?

时间:2014-08-20 00:18:42

标签: python regex lookbehind

我有这种格式的文件名:

INC_2AB_22BA_1300435674_218_19-May-2014_13-09-59.121._OK
INC_2EE_22RE_1560343444_119_11-Jun-2014_15-21-32.329._OK
INC_2CD_22HY_1652323334_312_21-Jan-2014_11-15-48.291._OK

我想在日期部分之前提取名称。例如,在第一个文件中需要 _19-May-2014_13-09-59.121._确定之前的任何内容都会产生 INC_2AB_22BA_1300435674_218

我尝试了回顾方法,但此刻无法解决这个问题。

必不可少,尝试匹配此模式_[0-9]-[aA-bB]-*

6 个答案:

答案 0 :(得分:3)

如果您的格式一致,您可以使用以下内容。

>>> s = 'INC_2AB_22BA_1300435674_218_19-May-2014_13-09-59.121._OK'
>>> '_'.join(s.split('_')[0:5])
'INC_2AB_22BA_1300435674_218'

答案 1 :(得分:2)

您可以尝试以下代码,

>>> import re
>>> s = """INC_2AB_22BA_1300435674_218_19-May-2014_13-09-59.121._OK
... INC_2EE_22RE_1560343444_119_11-Jun-2014_15-21-32.329._OK
... INC_2CD_22HY_1652323334_312_21-Jan-2014_11-15-48.291._OK"""
>>> m = re.findall(r'^.*?(?=_\d{2}-[A-Z][a-z]{2}-\d{4})', s, re.M)
>>> for i in m:
...     print i
... 
INC_2AB_22BA_1300435674_218
INC_2EE_22RE_1560343444_119
INC_2CD_22HY_1652323334_312

答案 2 :(得分:2)

试试这个:

.*(?=_\d{1,2}-[a-zA-Z]{3})

它使用前瞻断言来表示你所在日期的_00-Aaa格式。

答案 3 :(得分:1)

看起来这些线条有标准尺寸。只需使用

offset = len('INC_2AB_22BA_1300435674_218')`
for line in input:
     print line[:offset]

答案 4 :(得分:0)

由于您所需的数据位于该行的开头,因此锚点搜索非常简单:

^(.*)(?:_\d{2}-[a-zA-Z]{3}-\d{4})

Regular expression visualization

Debuggex Demo

>>> import re
>>> txt='''\
... INC_2AB_22BA_1300435674_218_19-May-2014_13-09-59.121._OK
... INC_2EE_22RE_1560343444_119_11-Jun-2014_15-21-32.329._OK
... INC_2CD_22HY_1652323334_312_21-Jan-2014_11-15-48.291._OK'''
>>> 
>>> re.findall(r'^(.*)(?:_\d{2}-[a-zA-Z]{3}-\d{4})', txt, re.M)
['INC_2AB_22BA_1300435674_218', 'INC_2EE_22RE_1560343444_119', 'INC_2CD_22HY_1652323334_312']

如果您想更加具体地在日期字段中匹配'Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec',您可以这样做:

>>> re.findall(r'^([^-]+)(?:_\d{2}-(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-\d{4})', txt, re.M)

...相同的输出

答案 5 :(得分:0)

另一个解决方案。如果长度始终相同,则也可以使用正则表达式

^([^$]{27})

或者这个

^(.{27}) 

Demo