1

次のような文字列のリストがあります

"funcname(arg, another_arg)*20 + second_func(arg1, arg2)"

引数だけを取り出したい。私は次のことを試しました:

re.findall(r'\w[\w\d_]+(?!\()', string)

ただし、これは戻ります

['funcnam', 'arg', 'another_arg', '20', 'second_fun', 'arg1', 'arg2']

'20'まず、文字列が単語の文字で始まるように指定したため、なぜ が表示されるのか少し混乱しています。第二に、探しているものに一致するように先読みを改善する方法を考えています。

一部の文字列には機能がなく、次のように見えることに注意してください。

"value1 + value_two"

そのため、括弧内を単純に検索することはできません。

4

3 に答える 3

1

これは、より適切に機能するはずの正規表現です。

(?!\w+\()[^\W\d]\w+

例えば:

>>> s = "funcname(arg, another_arg)*20 + second_func(arg1, arg2)"
>>> re.findall(r'(?!\w+\()[^\W\d]\w+', s)
['arg', 'another_arg', 'arg1', 'arg2']

[^\W\d]と同等[a-zA-Z_]です。

これは正規表現と同じロジックを使用しますが、先読みを文字列の先頭に移動することで、funcnamfromのような一致を防ぎますfuncname(...)。同様の代替手段を次に示します。

[^\W\d]\w+(?![\w(])
于 2012-04-20T16:08:08.250 に答える
1
>>> pattern = '[a-zA-Z_]\w*(?![\(\w])'
>>> re.findall(pattern, "funcname(arg, another_arg)*20 + second_func(arg1, arg2)")
['arg', 'another_arg', 'arg1', 'arg2']
>>> re.findall(pattern, "value1 + value_two")
['value1', 'value_two']
于 2012-04-20T16:28:13.777 に答える
1

これはおそらく悪い解決策ですが、私にとってはうまくいきます...:

R=r"[a-zA-Z_]\w*(?:s*\()?"  #This captures everything, leaving the left parenthesis on functions
values=filter(lambda x: '(' != x[-1], re.findall(R,s))  #now filter off everything containing a left parenthesis
#Or if you prefer list comprehensions...
values=[ x for x in re.findall(R,s) if x[-1]!='(' ]

ただし、他の答えはおそらくこれよりも優れているでしょう...これの1つの利点は、事後に関数を簡単に選択できることです-それらは「(」で終わります

于 2012-04-20T16:15:32.857 に答える