21

行頭または後に「a」がある「b」を検索したいとします。

re.match('[\^a]b','b')が一致しないのはなぜre.match('^b','b')ですか?

更新:searchの代わりに使用する必要があることに気付きましたmatch。「b」、「cab」、「ab」、「bc」、「abd」などの正の値にしたいのです。

4

2 に答える 2

24

正規表現は または の[\^a]bいずれab^bに一致するため、文字列 には一致しないはず'b'です。

文字列の先頭でのみ一致することに注意してくださいre.match()。これは、正規表現の先頭に文字列アンカーの先頭があるかのようです (^または\A複数行オプションが有効になっている場合)。

したがって、「行頭またはその後に「a」が続く「b」を検索するにはre.search()、次の正規表現を使用する必要があります。

(^|a)b

私はこれを他の回答とは少し異なって解釈していることに注意してください。あなたの要件は、 in だけでなく 'b' も一致させる必要があることを意味していると思います'bob'ab'taboo'ba

グループ内でこの方法を交互に使用すると、 よりもスケーラブルなソリューションが得られるため、文字列の先頭または, , , またはが先行する場合^b|abに一致させるには、次のようにします。bax25

(^|[ax25])b
于 2012-11-02T16:24:02.817 に答える
14

最初の正規表現は、次のことを意味します。

[\^a]b   # match a literal '^' or 'a', followed by a 'b'

2 番目の正規表現:

^b       # match start of line followed by a 'b'

最初の正規表現に本当に必要なものは次のとおりです。

^b|ab    # match start of line followed by a 'b', 
         # OR 
         # an 'a' followed by a 'b'

またre.match()、最初から一致するものを自動的に検索しようとすることに注意してくださいre.search()。文字列の途中にある文字列を検索する場合に使用します。

行頭または「a」、「x」、または「2」または「5」の後に「b」が続くものを検索したいとします。[^ax25]b代わりにできません^b|ab|xb|2b|5bか?

その場合、私は次のようにします。

(^|[ax25])b

文字クラスには、えーと、文字のみを含めることができます。キャレット ( ^) が文字クラス内にある場合、文字列の先頭に一致するゼロ幅アサーションとしてのキャレットの特別な意味が変わります。最初の文字の場合は文字クラス全体を否定するか、^エスケープされているか別の場所に配置されている場合はリテラル キャレット ( ) を意味します。

于 2012-11-02T16:19:35.683 に答える