1
import re

stri = "Hello guys.\nHow are you doing?\nI hope you have sweet dreams tonight."
regex = re.compile("guys[.\n]*$")

print regex.findall(stri)

.正規表現では、改行以外の任意の文字にすることができ、x または y のいずれかを意味[xy]*、文字の後にはその文字の任意の数を意味し$、文字列の末尾を示します。では、なぜ"guys[.\n]*$"私に与えないの"guys.\nHow are you doing?\nI hope you have sweet dreams tonight."ですか?

4

3 に答える 3

4

ピリオドを文字クラスに入れます。ここでは、文字にのみ一致する唯一の場所であり.、他には何も一致しません。そのクラスに含まれる[...]任意のリテラル文字を意味します。

代わりにre.DOTALL構成定数を使用します。

regex = re.compile("guys.*$", re.DOTALL)

.または、文字クラスの外側を保持し、\n改行を含むグループで使用する必要があります。

regex = re.compile("guys(?:.|\n)*$")

デモ:

>>> import re
>>> stri = "Hello guys.\nHow are you doing?\nI hope you have sweet dreams tonight."
>>> regex = re.compile("guys.*$", re.DOTALL)
>>> print regex.findall(stri)
['guys.\nHow are you doing?\nI hope you have sweet dreams tonight.']
于 2012-09-17T20:18:07.910 に答える
2

Martijn's answer は、あなたが見ている行動をよく説明しています。re.DOTALLまたはオプションの代わりに(?:.\n)、次のようなものを使用できます。

regex = re.compile(r"guys[\s\S]*$")

\s「すべての空白」を意味し、「空白以外のすべて」を意味するため\S、それらを文字クラスにまとめることで、改行を含む任意の文字に一致させることができます。

于 2012-09-17T20:26:27.617 に答える
0

使用するre.MULLTILINE と、行を超えて一致する必要があります...

>>> regex = re.compile("guys.*",re.DOTALL|re.MULTILINE)
>>> regex.findall(stri)
['guys.\nHow are you doing?\nI hope you have sweet dreams tonight.']

/編集:マルジンが指摘するように、私は複数行について間違っています

>>> regex = re.compile("guys.*",re.DOTALL)
>>> regex.findall(stri)
['guys.\nHow are you doing?\nI hope you have sweet dreams tonight.']
于 2012-09-17T20:21:13.330 に答える