2014-11-04 30 views
0

我試圖找到一個python正則表達式來匹配以下行,並且我的興趣是提取「|」之間每行的部分。和「。」 (在upx前)。 我的嘗試是:獲取數據的Python正則表達式

pattern=compile.re(re"^\S+\|(\S+).upx\.+") 

但它沒有工作

我的數據:

UMM_189|XXYT9888_UMX_5711769.upx_OWED_786_bopsio_34527_sen_72.345615 
AMW_126|7010.upx_XAWA01266525261 
QEA_234|Serami_bolismun_milte_1_UMM1.upx_YU_168145 
MMP_377|723C_UMM_5711781.upx_UXA_2_serax_78120_ser_23.26255277 

我的預期輸出:

XXYT9888_UMX_5711769 
7010 
Serami_bolismun_milte_1_UMM1 
723C_UMM_5711781 

更好的想法嗎?

+0

@ iCodez,感謝您發現錯誤。現在糾正了。 – 2014-11-04 18:46:47

回答

1

我不認爲正則表達式是必要的,因爲在這裏你的數據是相當有序。一個list comprehensionstr.splitstr.splitlines就足夠了:

>>> data = '''\ 
... UMM_189|XXYT9888_UMX_5711769.upx_OWED_786_bopsio_34527_sen_72.345615 
... AMW_126|7010.upx_XAWA01266525261 
... QEA_234|Serami_bolismun_milte_1_UMM1.upx_YU_168145 
... MMP_377|723C_UMM_5711781.upx_UXA_2_serax_78120_ser_23.26255277 
... ''' 
>>> [x.split('|', 1)[1].split('.upx', 1)[0] for x in data.splitlines()] 
['XXYT9888_UMX_5711769', '7010', 'Serami_bolismun_milte_1_UMM1', '723C_UMM_5711781'] 
>>> 
1

試試這個:

>>> re.findall(r'\|(.*?)\.',data) 
['XXYT9888_UMX_5711769', '7010', 'Serami_bolismun_milte_1_UMM1', '723C_UMM_5711781'] 
0
import re 
your_str = "UMM_189|XXYT9888_UMX_5711769.upx_OWED_786_bopsio_34527_sen_72.345615" 
result = re.match(r'^[A-Z]{3}_[0-9]{3}\|(?P<id>[A-Za-z0-9_]*).upx*', your_str) 
print result.group('id') 
+1

請給你的答案添加一些解釋。僅有代碼的答案有時足夠好,但代碼+解釋答案總是更好 – Barranka 2014-11-04 19:12:34

0

你有斜線點和向後點。嘗試 pattern=compile.re(re"^\S+\|(\S+)\.upx.+")

+0

感謝大家的幫助。 – 2014-11-06 23:20:07