2017-08-16 11 views
1

私は正規表現ではかなり経験がありませんが、関数のパラメータと一致する必要があります。この関数は文字列に複数回現れます。すべてのパラメータのリストを返したいと思います。関数のパラメータの正規表現

正規表現が一致している必要があります:

  1. 英数字と
  2. 内部には、特定の関数名の後の括弧
  3. 内に直接

を引用を強調しここでは例の文字列です:

Generic3(p, [Generic3(g, [Atom('_xyx'), Atom('y'), Atom('z_')]), Atom('x_1'), Generic2(f, [Atom('x'), Atom('y')])]) 

と私は出力としてこれを希望:

['_xyx', 'y', 'z_', x_1', 'x', 'y'] 

私がこれまで持っている:私はこれを呼んでいる

(?<=Atom\(')[\w|_]* 

輸入

s = "Generic3(p, [Generic3(g, [Atom('x'), Atom('y'), Atom('z')]), Atom('x'), Generic2(f, [Atom('x'), Atom('y')])])" 
print(re.match(r"(?<=Atom\(')[\w|_]*", s)) 

再しかし、これはちょうど Noneを印刷します。私はほぼそこにいるように感じますが、実際にはマッチを返すためにPython側で何かが不足しています。

s = "Generic3(p, [Generic3(g, [Atom('_xyx'), Atom('y'), Atom('z_')]), Atom('x_1'), Generic2(f, [Atom('x'), Atom('y')])])" 

r = "(?<=Atom\()\W\w+" 

final_data = re.findall(r, s) 

ます。また、これを試すことができます:

+0

' "r" Atom \( '(\ w +) "'(https://ideone.com/BkY7SD) )。 –

+0

一致または検索? https://stackoverflow.com/questions/180986/what-is-the-difference-between-pythons-re-search-and-re-match – doctorlove

答えて

1

はあなたの正規表現は近いです、あなたは、アンダースコアを見つけるために\W文字を追加する必要が

import re 

s = "Generic3(p, [Generic3(g, [Atom('_xyx'), Atom('y'), Atom('z_')]), Atom('x_1'), Generic2(f, [Atom('x'), Atom('y')])])" 

new_data = re.findall("Atom\('(.*?)'\)", s) 

出力:たぶん

['_xyx', 'y', 'z_', 'x_1', 'x', 'y'] 
+0

Atom \( '(。*?)' \ 'を使用できます。 ) "と正規表現マッチを後処理する必要はありません。 –

+0

@WiktorStribiżewあなたの提案をありがとうございます。私の最近の編集を見てください。 – Ajax1234

関連する問題