web-dev-qa-db-ja.com

re.compileせずに大文字と小文字を区別しない正規表現?

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)のようなものが見つかりません。

260
Mat

re.IGNORECASEflagssearch 、または matchsubパラメーターに渡します。

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

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

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

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

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

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

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

輸入品で

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'):
3
Douglas Daseeco
#'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'>
3
jackotonye

大文字と小文字を区別しない操作を実行するには、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'
2
Srivastava