2017-01-03 9 views
2

私はHOWTOとreモジュールのドキュメントを何度も読んできましたが、Python正規表現でオプション性とグループ化がどのようにやりとりされるのか混乱しています。私が望むのは、グループ内のすべてのものをマッチさせるか、まったくマッチさせることではありませんが、部分文字列がマッチングしていることがわかります。ここでは、最小限の例です:Pythonでオプションの完全な文字列と正規表現を一致させる

>> re.compile(r"(test)?").search("tes") 
<_sre.SRE_MATCH at 0xBlahBlah> 

私はオプションとしてマーク文字列全体testを持っているので、私は、ないが一致することを期待。私は理解していないのは何ですか(文書の一部)?次のように

私が実際に興味があるものに近いです問題のバージョンは次のとおりです。

>> re.compile(r"(distance|mileage)(\sbetween)?").search("distancebetween") 
<_sre.SRE_MATCH at 0xBlahblah> 

空白が一致することを余儀なくされていないということであるのはなぜ?

EDIT 2017年1月4日 の答えは、これまで有用であるが、私は、私は十分に明らかに私の必要性を説明していなかったと思います。要するに

、私は(そこに全体が)fooまたはbar(その全体が)、またはfoo bazまたはbar bazと一致していないし、何もします正規表現をしたいです。

>> m = re.compile("(foo|bar)(\sbaz)?") 
>> m.search("foo ba") 
<_sre.SRE_Match as 0xBlahblah> 
>> m.search("foo ba").span() 
(0, 3) 

だから私は何が起こっていることは、それはfooに一致し、さらに下流何気にいないということであることがわかります。 bazでのみ一致させるにはどうすればよいのですか?

答えて

4

はのが一致したものを見てみましょう:

import re 
m = re.compile(r"(test)?").search("tes") 
m.span() 
# have (0, 0) 

それは空の文字列です。どうして?

ここで?は、を意味するので、0または1回(ちょうど{0, 1}のように)です。したがって、最初のグループは文字列testまたは空の文字列(これは私たちが持っている)に一致することができます。ここ

docsからの引用である:

'?'得RE先行するREの0または1回の繰り返しに一致するように原因 。 ab? 'a'または 'ab'と一致します。

1

私はあなたがオプションのマッチを使いたいとは思わないと思います。私はあなたが正確に正規表現をしたいと思うが、?がないと思う。あなたの最初の例

>>> re.compile(r"(test)").search("tes") 
>>> re.compile(r"(test)").search("test") 
<_sre.SRE_Match object at 0x104c64210> 
>>> re.compile(r"(test)").search("testing") 
<_sre.SRE_Match object at 0x104c64198> 

あなたの第二の例を示します。?

>>> re.compile(r"(distance|mileage)(\sbetween)").search("distancebetween") 
>>> re.compile(r"(distance|mileage)(\sbetween)").search("distance between") 
<_sre.SRE_Match object at 0x104bf5608> 
>>> re.compile(r"(distance|mileage)(\sbetween)").search("distance ") 
1

どちらの場合も、あなたがグループの0または1 occurancesのいずれかをしたいと言っています。だから"(test)?"と "test"が一致しない場合、またはは文字列の最初の部分になります。

第2の場合、"(distance|mileage)(\sbetween)?"には、「距離」、「マイレージ」または「距離」または「距離」の4つの一致があります。

これらのうちどれも文字列全体である必要はありませんので、前後にテストを行うことができます。そうでない場合は、開始を欲しい場合は^regex、最後に一致させる場合はregex$、最後には^regex$が必要です。