2017-02-03 89 views
0

我想檢索字符串之間,使用正則表達式正則表達式刪除NUMERICS兩個字符串

在我下面的例子,A​​BC,DEF和HIJ將永遠是相同的值忽略了其他兩個字符串之間的所有數字,並在被搜索的字符串的位置相同,但123和456將始終是不同的值和長度。

我的例子字符串是:

"ABC 123 456 DEF HIJ" 

我想會留下的結果:

"DEF" 

我可以用

r'ABC (.*) HIJ' 

與兩行做到這一點這讓我留下了123 456 DEF,然後我可以:

r'[^0-9\s]' 

這似乎應該是可能的,但我真的似乎無法弄清楚,如果是這樣。

+0

威爾你正在尋找的術語永遠是線上的第二個單詞?只是出於好奇心,我希望它不總是DEF :) –

+0

HIJ將永遠是最後一個,ABC總是第一個 – Giovanni

+0

我想知道你是否可以用這個事實,你正在尋找句尾的第二個單詞想出一些簡短的東西。 –

回答

4

在正則表達式中\d+會匹配1個或更多數字(貪婪)。

>>> import re 
>>> s = "ABC 123 456 DEF HIJ" 
>>> pat = r'ABC \d+ \d+ (.*) HIJ' 
>>> re.findall(pat, s) 
['DEF'] 
0

如何對正則表達式:(由於更新到第一個評論)

([A-ZA-Z] +)\ [A-ZA-Z] + $

它將捕獲在行尾分隔的2個單詞的第一個。

import re 

s = "ABC 123123123 1231231234 DEF HIJ" 
pat = r'([A-Za-z]+)\ [A-Za-z]+$' 
a = re.findall(pat,s) 
print (a) 

給 'DEF'

要捕捉多個單詞在那個位置,你可以修改模式:

r'\ ([A-Za-z\ ]+)\ [A-Za-z]+$' 

對於ABC 234234 46456456 DEF ZYX​​ HIJ的輸入,這會給你'DEF ZYX​​'。

如果你想強制執行第一個字符串必須是ABC和最後一個HIJ,那麼wim的其他答案將做的伎倆。

+1

看一下ascii表,你會明白''[A-z]'不是你想象的,也不只包含字母。 –

+0

該死的標點符號應該貼在[A-Za-z]上。已更新以反映您的輸入。必須承認,自從我用ALT代碼構建'UI'後,我沒有看過ASCII表格。 –

4

根據究竟是什麼固定的輸入數據,你可以嘗試用這樣的方式提取的第二個「字」,允許(和忽略)介入的數字串:

foo = "ABC 123 456 DEF 456 HIJ" 
pat = r'\w+\s+[\d ]*(\w+)[\d ]*\w+' 
re.findall(pat, foo) 
['DEF'] 

另外,正則表達式可能不是最簡單的方法。您可以使用一個正則表達式去除所有數字字符,將剩餘的字符串拆分爲空白,然後取第二個元素。

+0

顯然,工作人員發現你從南極發送這個答案。做好答案,並且[大概是第一個](https://twitter.com/i/web/status/827536984176476163)發送來自第7大陸的帖子! – Mast

0

基於「ABC,DEF和HIJ將始終是相同的值,和在字符串的相同位置被搜索,但123和456將始終是不同的值和長度」:

>>> re.sub("ABC \d+ \d+ DEF HIJ", "DEF", "foo1 ABC 12345 67890 DEF HIJ foo2") 
'foo1 DEF foo2' 
相關問題