2017-01-22 6 views
1

私はPythonで任意の電話番号を含む文字列のリストを持っています。 拡張子はオプションです。regex pythonをグループ化するベストプラクティス

st = ['(800) 555-1212', 
'1-800-555-1212', 
'800-555-1212x1234', 
'800-555-1212 ext. 1234', 
'work 1-(800) 555.1212 #1234'] 

私の目的は、個々のグループを分離できるように電話番号を分離することです。 '800'、 '555'、 '1212'、およびオプションの '1234'。

次のコードを試しました。

p1 = re.compile(r'(\d{3}).*(\d{3}).*(\d{4}).*(\d{4})?') 
step1 = [re.sub(r'\D','',p1.search(t).group()) for t in st] 
p2 = re.compile(r'(\d{3})(\d{3})(\d{4})(\d{4})?') 
step2 = [p2.search(t).groups() for t in step1] 

p1とp2は、目的の出力をフェッチする2つのパターンです。

for i in range(len(step2)): 
print step2[i] 

出力された:

('800', '555', '1212', None) 
('800', '555', '1212', None) 
('800', '555', '1212', '1234') 
('800', '555', '1212', '1234') 
('800', '555', '1212', '1234') 

私は初心者ですので、私はこのような問題やPythonコミュニティに続くいくつかのベストプラクティスをtacleするためのより良い方法があるかどうかの提案を取得したいです。前もって感謝します。

私は re.findallとグループの類似性はあなたに簡単な方法が可能だと思う

答えて

1

>>> import re 
>>> from pprint import pprint 
>>> res = [re.findall(r'\d{3,4}', s) for s in st] 
>>> pprint res 
[['800', '555', '1212'], 
['800', '555', '1212'], 
['800', '555', '1212', '1234'], 
['800', '555', '1212', '1234'], 
['800', '555', '1212', '1234']] 
1

代わりの文字列全体に一致するようにしようと希望のサブストリングをキャプチャし、あなただけのlenghts 3または4で数字を一致させることができます。Regex101上

デモ:https://regex101.com/r/XNbb79/1

import re 

st = ['(800) 555-1212', 
'1-800-555-1212', 
'800-555-1212x1234', 
'800-555-1212 ext. 1234', 
'work 1-(800) 555.1212 #1234'] 

for b in [re.findall('\d{3,4}', a) for a in st]: 
    if len(b) == 3: 
     print "number does not have extension" 
     print b 
    if len(b) == 4: 
     print "number has extension" 
     print b 

出力:

number does not have extension 
['800', '555', '1212'] 
number does not have extension 
['800', '555', '1212'] 
number has extension 
['800', '555', '1212', '1234'] 
number has extension 
['800', '555', '1212', '1234'] 
number has extension 
['800', '555', '1212', '1234'] 
0

つ以上(あなたの変更):

import re 
pattern = re.compile('.*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4})[^\d]*(\d{4})?$') 
print [[pattern.match(s).group(i) for i in range(1,5)] for s in st] 

#[['800', '555', '1212', None], ['800', '555', '1212', None], ['800', '555', '1212', '1234'], ['800', '555', '1212', '1234'], ['800', '555', '1212', '1234']] 
関連する問題