re.compileを使用しない、大文字と小文字を区別しない正規表現?


331

Pythonでは、次のコマンドを使用して、大文字と小文字を区別しない正規表現をコンパイルできますre.compile

>>> s = 'TeSt'
>>> casesensitive = re.compile('test')
>>> ignorecase = re.compile('test', re.IGNORECASE)
>>> 
>>> print casesensitive.match(s)
None
>>> print ignorecase.match(s)
<_sre.SRE_Match object at 0x02F0B608>

同じことをする方法はありますが、を使用しませんre.compile。ドキュメントにPerlのiサフィックス(などm/test/i)のようなものは見つかりません。


1
通常のエクスプロソインの優れた紹介は、python-course.eu / re.php
2Obe

回答:


562

合格re.IGNORECASEflagsのPARAM searchmatchまたはsub

re.search('test', 'TeSt', re.IGNORECASE)
re.match('test', 'TeSt', re.IGNORECASE)
re.sub('test', 'xxxx', 'Testing', flags=re.IGNORECASE)

2
re.match('test', 'TeSt', re.IGNORECASE)TypeErrorいずれかの属性がである場合につながる可能性がありますNone。first_string == second_stringによる一致try & exceptをキャッチTypeErrorするために使用します。サンプルコードの def equal_ignore_case(first_string, second_string): try: return re.match(first_string, second_string, re.IGNORECASE) is not None except (AttributeError, TypeError): return first_string == second_string デモコード
Abhijeet 2017年

3
@Abhijeetその場合は、try / exceptを実際に使用しないでください。None最初に文字列があるかどうかを確認してください。
erb

それ以外の場合は引数に渡すflagsために名前付き引数を使用することが重要です(s。また、stackoverflow.comre.subre.IGNORECASEcount
questions / 42581 /…

101

IGNORECASEフラグなしで検索/一致を使用して、大文字と小文字を区別しない検索を実行することもできます(Python 2.7.3でテスト済み):

re.search(r'(?i)test', 'TeSt').group()    ## returns 'TeSt'
re.match(r'(?i)test', 'TeSt').group()     ## returns 'TeSt'

2
ドキュメントには、特定のバージョンで追加される機能については記載されていません(たとえば(?(condition)yes|no)、2.4で追加されたと言うのではありません)。そのため、追加されreたと思われるモジュールの最初のバージョン以降、常に利用できると思います。 1.5で。基本的には、Pythonに関しては、当初からすべての意図と目的に対応しています。これは、このページの最初のセクションの約半分に文書化されています:docs.python.org/2/library/re.html#regular-expression-syntax
ArtOfWarfare

4
ここに行きます-1.5のドキュメントを調べたところ、このページの約60%にドキュメント化されていることがわかりました:docs.python.org/release/1.5/lib/…1.4のドキュメントもチェックしましたが、言及されていませんこの機能。そのため、regexモジュールが1.5で追加されたと思いreます。モジュールが廃止されたためです。
ArtOfWarfare

3
フラグを必要としないため、これは素晴らしいソリューションです。私の場合、Redisに検索文字列を格納していますが、これは非常に役立ちます。
プライベート

3
@Private:概念的には、前のキャプチャグループだけでなく正規表現全体に re.Iフラグを設定します。re.match(r'''A ((?i)B) C''', "a b c").group(0)Bだけでなく、すべて(AおよびC)で大文字と小文字を区別しない一致が発生することに注意してください!特定のキャプチャグループで大文字と小文字の一致のみが必要な場合、これは探しているドロイドではありません。
smci

1
@プライベート:はい、完全にそうです。私の要点は、概念的にはフラグを設定することと同じです。正規表現全体について。それより前のグループ(!)「次のキャプチャグループでのみ大文字と小文字を区別しない」という構文はありません。
smci

53

大文字と小文字を区別しないマーカーは(?i)、正規表現パターンに直接組み込むことができます。

>>> import re
>>> s = 'This is one Test, another TEST, and another test.'
>>> re.findall('(?i)test', s)
['Test', 'TEST', 'test']

2
より優れたオプション、プラットフォーム間での正規表現の移植性、宣言の意図が明確
Sina Madani 2017年

1
この'(?i)'アプローチには、正規表現のリストを作成できるという利点もあります。その一部は大文字と小文字を区別せず、一部はそうではありません。(そしてもちろん、必要にre.compile応じてそのリストをマップすることができます。)
not-just-yeti

@SinaMadani混乱しています。それよりも移植性が高いのflags=re.IGNORECASEですか?
Romain Vincent

10

パターンのコンパイル時に大文字と小文字を区別しないように定義することもできます。

pattern = re.compile('FIle:/+(.*)', re.IGNORECASE)

5
質問でOPはこれを使用し、別の方法があるかどうかを尋ねます。
Peter Wood

6
高速スクロールするものに役立ちます。
stevek 2016年

6

輸入品

import re

実行時処理:

RE_TEST = r'test'
if re.match(RE_TEST, 'TeSt', re.IGNORECASE):

使用しないことre.compileは無駄です。上記のmatchメソッドが呼び出されるたびに、正規表現がコンパイルされます。これは、他のプログラミング言語でも間違った方法です。以下はより良い実践です。

アプリの初期化:

self.RE_TEST = re.compile('test', re.IGNORECASE)

実行時処理:

if self.RE_TEST.match('TeSt'):

1
ありがとうございました!コンパイルについて誰も話しませんが、それは最も賢いオプションです!
StefanJCollier 2018

2
OPは文字re.compile()
列を

4
#'re.IGNORECASE' for case insensitive results short form re.I
#'re.match' returns the first match located from the start of the string. 
#'re.search' returns location of the where the match is found 
#'re.compile' creates a regex object that can be used for multiple matches

 >>> s = r'TeSt'   
 >>> print (re.match(s, r'test123', re.I))
 <_sre.SRE_Match object; span=(0, 4), match='test'>
 # OR
 >>> pattern = re.compile(s, re.I)
 >>> print(pattern.match(r'test123'))
 <_sre.SRE_Match object; span=(0, 4), match='test'>

4

大文字と小文字を区別しない操作を実行するには、re.IGNORECASEを指定します

>>> import re
>>> test = 'UPPER TEXT, lower text, Mixed Text'
>>> re.findall('text', test, flags=re.IGNORECASE)
['TEXT', 'text', 'Text']

ケースに一致するテキストを置き換える場合...

>>> def matchcase(word):
        def replace(m):
            text = m.group()
            if text.isupper():
                return word.upper()
            elif text.islower():
                return word.lower()
            elif text[0].isupper():
                return word.capitalize()
            else:
                return word
        return replace

>>> re.sub('text', matchcase('word'), test, flags=re.IGNORECASE)
'UPPER WORD, lower word, Mixed Word'

1

置換したいが、それでも以前のstrのスタイルを維持したい場合。可能です。

例:文字列「test asdasd TEST asd tEst asdasd」を強調表示します。

sentence = "test asdasd TEST asd tEst asdasd"
result = re.sub(
  '(test)', 
  r'<b>\1</b>',  # \1 here indicates first matching group.
  sentence, 
  flags=re.IGNORECASE)

test asdasd TEST asd tEst asdasd


0

大文字と小文字を区別しない正規表現(Regex)の場合:コードを追加する方法は2つあります。

  1. flags=re.IGNORECASE

    Regx3GList = re.search("(WCDMA:)((\d*)(,?))*", txt, **re.IGNORECASE**)
  2. 大文字と小文字を区別しないマーカー (?i)

    Regx3GList = re.search("**(?i)**(WCDMA:)((\d*)(,?))*", txt)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.