2016-11-14 11 views
3

私はbeautifulsoup操作の後に生成されるリストを持っています。それは内部リストとして分割したい括弧内の数字で区切られた文字列を持っています。たとえば、私は、これは私がこの括弧で数字で終わる文字列を区切るPython正規表現

[re.split(r'\(\d\)',item) for item in L1] 

で開始

[[‘alpha’, ‘beta’],[‘gamma’, ‘delta’]] 

に変換する必要がありますが、これが最後の項目で追加のスペースを作成し、1つの以上の空白項目を生成

L1=['alpha(1) beta(4)','delta(5) gamma(6)'] 

を持っています最後に。

[['alpha', ' beta', ''], ['delta', ' gamma', '']] 

だから私はこの

L1=[re.split(r'\(\d\)',item) for item in L1] 
[[x.strip() for x in y if x] for y in L1] 

のようなコードに1行を追加し、これはだから私のクエリが

  1. なぜそれをしている私が

    [['alpha', 'beta'], ['delta', 'gamma']] 
    

    欲しいものを提供しますコマンドの最初の行だけを使って何をしますか?なぜ最後の要素が作られたのか?

  2. これを単一かつ簡単な正規表現で実現する良い方法はありますか?

    print([[j.split("(")[0] for j in i.split()] for i in L1]) 
    

    戻り値:

答えて

2

、[「」] re.split()str.split()に同じ振る舞い、およびstr.split()のためのドキュメントは、明示的

は、指定されたセパレータ戻ると、空の文字列を分割する状態となります。

セパレータの右側に空の文字列があるため、split()の結果に空の文字列が表示されます。私は、emtpy文字列のために''を返すという考えは、より一貫性のある予測可能な振る舞いをもたらすと考えています。あなたのコードを実装するためのより良い方法に関しては

、私は次は少し明確だと思う:

>>> L1=['alpha(1) beta(4)','delta(5) gamma(6)'] 
>>> name_list = [] 
>>> for s in L1: 
    name_list.append(re.findall(r'(\w+)\(\d+\)', s)) 
>>> name_list 
[['alpha', 'beta'], ['delta', 'gamma']] 

やリストの内包表記を使用して:

name_list = [re.findall(r'(\w+)\(\d+\)', s) for s in L1] 
+0

はちょうどこれを提案しようとしていました - 'findall'はあなたが後にしているものを実装するより読みやすい方法だと思います。 – asongtoruin

+0

あなたの説明は非常に役に立ちます。ありがとう! – PagMax

3

私は分割を使用し、コンマの上

[['alpha', 'beta'], ['delta', 'gamma']] 
+0

これは正規表現を使用しなくても非常にエレガントな方法です。ありがとうございます – PagMax

+0

喜んで助けてください!これがあなたのための適切な解決策である場合、答えを正しい解決策としてマークしてください!ありがとう –

+0

ありがとう。私は以下の質問にも私の質問に答えると思うし、私に代替のアプローチを与える。私はそれを受け入れた。この場合、4つのソリューションがすべて私が新しいコマンドを学ぶのに役立ちました! – PagMax

1

分割をして、ブラケットと数字を置き換えるために正規表現を使用しています。最後に、文字列をスペースに分割します。ドキュメントから

import re 
>>> [re.sub('\(\d\)', '', y).split() for x in L1 for y in x.split(',')] 
[['alpha', 'beta'], ['delta', 'gamma']] 
2

\(\d\)パターンは、複数の非を見つけますあなたの文字列内の重複したマッチを検索し、それらの場所で文字列を分割します。つまり、最後に(4)betaと文字列の最後の間にあるので、'alpha(1) beta(4)'alphabetaに空の文字列に分割します。あなたは、元のre.splitアプローチで正規表現を使用する場合は、結果のリストに空の項目を取り除くためにfilterを使用して検討すること

import re 
L1=['alpha(1) beta(4)','delta(5) gamma(6)'] 
res = [filter(None, re.split(r'\(\d+\)\s*', item)) for item in L1] 
print(res) 
# => [['alpha', 'beta'], ['delta', 'gamma']] 

Python demoを参照してください。 \(\d+\)\s*はカッコ内の数字と一致し、\s*は0以上の空白に一致します。

関連する問題