2012-01-24 18 views
0

私はすべてのテキストをa!表示されます。例特定の文字までのPython正規表現の繰り返し

some textwfwfdsfosjtortjk\n 
sdsfsdfsdfsdfsdfsdfsdfsfsfsdfsdfsdf\n 
sfsgdfgdfgdgdfgdg\n 
! 

!私はこの

"+\n^.+\n^.+" 

などのREGのEXPをハードコーディングすることはできませんので、変更私はre.MULTLINEを使用していますが、私はre.DOTALLを使用すべきですか?

おかげ

答えて

4

なぜこれに正規表現が必要ですか?

index = str.find('!') 
if index > -1: 
    str = str[index:] # or (index+1) to get rid of the '!', too 
0

はあなたが読んでいるその特定の文字のための「先読み」に見て、その代わりにパターンとして全体の最初の部分と一致しています。

私はPythonの正規表現リーダーはルビーと異なっている正確にどのようにわからないんだけど、あなたはrubular.comでそれで遊ぶことができます

は多分のようなもの:

([^!]*(?=\!)) 

が(ただ、これを試してみました、と思われます仕事に)

+0

'[^。]'は '.'以外の文字にマッチします。私はそれがあなたが意味するものだとは思わない。 –

+0

申し訳ありません、はい...それはまたすべきです! – Relic

-1

re.DOTALLは十分なものでなければならない:

import re 
text = """some textwfwfdsfosjtortjk 
sdsfsdfsdfsdfsdfsdfsdfsfsfsdfsdfsdf 
sfsgdfgdfgdgdfgdg 
!""" 
rExp = re.compile("(.*)\!", re.S) 
print rExp.search(text).groups()[0] 

some textwfwfdsfosjtortjk 
sdsfsdfsdfsdfsdfsdfsdfsfsfsdfsdfsdf 
sfsgdfgdfgdgdfgdg 
+0

-1は最後の '!'にマッチしますが、FIRST –

0

それは仕事をする必要があります。

re.compile('(.*?)!', re.DOTALL).match(yourString).group(1) 
+0

-1は最初のものではなく最後の '!'まで一致しません。マルチラインは無関係です。 –

+0

@JohnMachin貪欲な部分を削除しました。お知らせしてくれてありがとう。 –

3

は、だから、最初!文字(は含まない)までの入力の最初からすべてを一致させたいですか?これはそれを行う必要があります:

感嘆符がない場合、これは文字列全体と一致します。あなたがそれらで!でのみ文字列を一致させたい場合は、先読みを追加します。

何があるので、そこにはアンカー( ^$は)ありません、とDOTALLが必要とされていないため
re.match(r'[^!]*(?=!)', input) 

MULTILINEフラグは必要ありませんドット。

+0

+1:それは動作します、それは "文字列のない"場合に対処する、それはマルチラインとDOTALLが必要でない理由を説明します –

+0

ええ、この男は正規表現のコンサルタントとしてギグを取得! – kindall

0

私はこれが必要以上に複雑になっていると思います。あなたのregのexpは、 "repeat(!を除く任意の文字!)の後ろに!"と言う必要があります。 [^!]は「!以外の文字」を意味することを忘れないでください。だから、

、次のように:

>>> import re 
>>> rexp = re.compile("([^!]*)!") 
>>> test = """sdasd 
... asdasdsa 
... asdasdasd 
... asdsadsa 
... !""" 
>>> rexp.findall(test) 
['sdasd\nasdasdsa\nasdasdasd\nasdsadsa\n'] 
>>> 
+0

マルチラインは必須ではありません。 –

+0

正直、ありがとう@JohnMachin – snim2

1

「許可よりも許しを依頼する方が簡単」のPythonの哲学(EAFP)に続いて、私はあなたが理解し、以降の保守が容易であるサブルーチンを作成する提案は、あなたのすべきセパレータの変更。

SEPARATOR = u"!" 
def process_string(s): 
try: 
    return s[:s.index(SEPARATOR)] 
except ValueError: 
    return s 

この関数は、区切り文字として定義した文字列を最初から最後まで返します。セパレータが見つからない場合は、文字列全体が返されます。この関数は、改行に関係なく機能します。セパレータが変更された場合は、単にSEPARATORに変更してください。

ValueErrorは、文字列内の文字はない(コマンドラインでそれを試すのインデックスを要求したときに発生する例外です:。"Hola".index("1")ValueError: substring not foundを発生させます)ワークフローは、時間のほとんどは、あなたがSEPARATOR文字を期待していることを前提としてい文字列内にあることを確認してから、最初に許可を求めることなく(SEPARATORが文字列内にあるかどうかをテストします)、失敗した場合(indexメソッドが呼び出されてValueError)、許しを求めます(EAFP)は、適用するとPythonとみなされます。

これは単純な問題です。

関連する問題