2017-08-10 14 views
2

Regexを使って1つのステートメントを抽出して別のステートメントに変換する最良の方法は何ですか? 、変換用正規表現

AB-123-CDにAB123CDをこれが実装されている:

具体的には、次のように私が見つけ、テキストのブロックからsudent番号を抽出し、それを変換するには、以下の実施しています3文として、次のように:

gg['student_num'] = gg['student_test'].str.extract('(\d{2})\w{3}\d{2}') + \ 
        '-' + gg['student_num'].str.extract('\d{2}(\w{3})\d{2}') + \ 
        '-' + gg['student_test'].str.extract('\d{2}\w{3}(\d{2})') 

それは私が3つの文持っている必要があると私には右感じていない - 各グループの 1を - (これはもっと複雑だった場合でも、より多くのまたは)一緒に下に連結され、それがあるかどうか疑問に思ったいくつかのテキストを見つけて変換するより良い方法でしたか?あなたがこの方法正規表現を使用したセグメントのリストを取得し、それらを結合することができ

+0

をstr.replace(R'(\ {2} W)(\ D {3})(\ w {2}) '、r' \ 1- \ 2- \ 3 ') 'となります。さて、データがどの列にあるのかは不明ですが、 'replace'を試してみてください。 –

答えて

2

'-'.join(re.search(r'(\d{2})(\w{3})(\d{2})', string).groups()) 

stringが必要なパターン(re.search()戻りNone)が含まれていないので、あなたがラップする場合があります場合は、AttributeErrorを得ることができますこの式はtry...exceptブロックです。

+0

これは素晴らしく、グループが注文リストのように出てきていることに気付かなかった。非常にPythonic。 – NickP

+0

正確には、一致したグループのタプルを返します。 – bakatrouble

1

これは正規表現ではありませんが、それは、迅速かつ簡潔である:

s = "AB123CD" 

first = [i for i, a in enumerate(s) if a.isdigit()][0] 
second = [i for i, a in enumerate(s) if a.isdigit()][-1] 

new_form = s[:first]+"-"+s[first:second+1]+"-"+s[second+1:] 

出力:

AB-123-CD 

代替正規表現のソリューション:

letters = re.findall("[a-zA-Z]+", s) 
numbers = re.findall("[0-9]+", s) 
letters.insert(1, numbers[0]) 
final = '-'.join(letters) 
print(final) 

出力:

AB-123-CD 
0

これを試してください。すなわち

>>> import re 
>>> s = r'ABC123DEF' 
>>> n = re.search(r'\d+',s).group() 
>>> f = re.findall(r'[A-Za-z]+',s) 
>>> new_s = f[0]+"-"+n+"-"+f[1] 
>>> new_s 

出力ホープ:GG [ 'student_numが'] [ 'student_test'] GGを= '試し

'ABC-123-DEF'