1

これを処理する方法は何ですか?文字列、生の文字列、(?is)、re.DOTALL のさまざまな順列を試しましたが、一様に失敗しました。

以下は、私が試したことのサンプルです。

>>> x="select a.b from a join b \nwhere a.id is not null"
>>> print (x)
select a.b from a join b 
where a.id is not null
>>> y=re.match("(?is)select (.*) from (.*) where (?P<where>.*)",x,re.DOTALL)
>>> y.groupdict()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'groupdict'

注意も試しました:

    >>> x=r"""select a.b from a join b
 where a.id is not null""""

同じ (間違った結果)

また、(?is) と re.DOTALL を使用して/使用せずに試しました。

注: 埋め込まれた改行がテストされた文字列から削除された場合、一致は完全に機能します。

>>> nonewline="select a.b from a join b where a.id is not null"
>>> y=re.match("(?is)select (.*) from (.*) where (?P<where>.*)",nonewline,re.DOTALL|re.MULTILINE)
>>> y.groupdict()
{'where': 'a.id is not null'}
4

1 に答える 1

2

where問題は、実際にはステートメントの直前にスペースではなく改行があることだと思います。

あなたのテキスト:

"select a.b from a join b \nwhere a.id is not null"

------------------------------------------------^

あなたの正規表現:

(?is)select (.*) from (.*) where (?P<where>.*)

-----------------------------------------------^

代わりに次のようにしてみてください。

from re import *

x = "select a.b from a join b \nwhere a.id is not null"
y = match("select\s+(.*?)\s+from\s+(.*?)\s+where\s+(?P<where>.*)",
                                                            x, DOTALL)
print(y.groups())
print(y.groupdict())

出力:

('a.b', 'a join b', 'a.id is not null')
{'where': 'a.id is not null'}
于 2013-06-01T23:45:35.487 に答える