Yeniden derleme olmadan büyük / küçük harfe duyarsız düzenli ifade?


331

Python, kullanarak normal bir ifade büyük / küçük harf duyarlı olmayan derleyebilir 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>

Aynı şeyi yapmanın bir yolu var mı, ama kullanmadan re.compile. Belgelerde Perl'in isoneki (ör. m/test/i) Gibi bir şey bulamıyorum .


1
Düzenli experssoins için mükemmel bir giriş bulabilirsiniz: python-course.eu/re.php
2Obe

Yanıtlar:


562

Geçiş re.IGNORECASEiçin flagsbir param search, matchya 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özelliğin herhangi birinin ne zaman olduğuna yol açabilir None. First_string == second_string ile eşleşmeyi try & exceptyakalamak için kullanılır TypeError. Örnek Kod 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 Gösteri Kodu
Abhijeet

3
@Abhijeet Gerçekten bu durumda try / komutunu kullanmamalısınız. Noneİlk önce dizelerden herhangi birinin olup olmadığını kontrol edin .
erb

Bu adlandırılmış argüman kullanmak önemlidir flagsiçin re.subaksi takdirde geçer re.IGNORECASEiçin countargüman (lar da. Stackoverflow.com/questions/42581/... )
L3n95

101

IGNORECASE bayrağı (Python 2.7.3'te test edilmiştir) olmadan arama / eşleme özelliğini kullanarak büyük / küçük harfe duyarlı olmayan aramalar da yapabilirsiniz:

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

2
Belgeler, herhangi bir belirli sürümde eklenen özelliğe değinmiyor (aksine, (?(condition)yes|no)2.4'te eklendiğini söylüyor), bu yüzden remodülün ilk versiyonundan beri her zaman kullanılabilir olmasını bekliyorum. 1.5. Temelde Python söz konusu olduğunda tüm niyet ve amaçlar için zamanın başlangıcından beri. Bu sayfanın ilk bölümü boyunca yaklaşık yarı yolda belgelenmiştir: docs.python.org/2/library/re.html#regular-expression-syntax
ArtOfWarfare

4
İşte başlıyoruz - 1.5 için belgelere baktım ve bu sayfanın aşağı yukarı% 60'ını belgelediğini gördüm : docs.python.org/release/1.5/lib/… Ayrıca 1.4 belgeyi de kontrol ettim. bu özellik. Bu yüzden regexmodül modül lehine kullanımdan kaldırıldığında 1.5'te eklendiğini tahmin ediyorum re.
ArtOfWarfare

3
Bu, bayrak gerektirmediği için güzel bir çözümdür. Benim durumumda arama dizelerini Redis'te saklıyorum ve bu gerçekten yararlı.
Özel

3
@Özel: kavramsal olarak, re.I bayrağını tüm regex'te ayarlar - sadece öncekini yakalama grubunu değil. Bunun re.match(r'''A ((?i)B) C''', "a b c").group(0)yalnızca B'de değil, her şeyde (A ve C) büyük / küçük harf duyarlı eşleşmeye neden olduğunu unutmayın! Yalnızca belirli bir yakalama grubunda vaka-insens eşleşmesi istiyorsanız, bu aradığınız droid değildir.
smci

1
@Özel: evet tamamen. Demek istediğim, kavramsal olarak bir bayrak ayarlamakla aynı. Tüm regex üzerinde. Ondan önce gelen gruplar bile (!). "Yalnızca aşağıdaki yakalama gruplarında büyük / küçük harfe duyarlı olmayan" sözdizimi yoktur.
smci

53

Büyük / küçük harfe duyarlı olmayan işaret, (?i)doğrudan normal ifade modeline dahil edilebilir:

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

2
Daha iyi bir seçenek, regex'i platformlar arasında taşınabilir hale getirir ve beyanda niyet açıktır
Sina Madani

1
Bu '(?i)'yaklaşımın bir kısmı da büyük / küçük harfe duyarlı olmayan, bazıları ise regexp'lerin bir listesini oluşturabilme avantajına sahiptir. (Ve tabii ki, isterseniz re.compilebu listeyi eşleyebilirsiniz .)
sadece-yeti değil

@SinaMadani Kafam karıştı. Bu nasıl daha taşınabilir flags=re.IGNORECASE?
Romain Vincent

10

Desen derlemesi sırasında büyük / küçük harfe duyarsız da tanımlayabilirsiniz:

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

5
Soruda OP bunu kullanıyor ve bunu yapmanın başka bir yolu olup olmadığını soruyor.
Peter Wood

6
Hızlı kaydırma yapanlar için faydalıdır.
stevek

6

İthalatta

import re

Çalışma süresi işlemede:

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

Kullanılmamanın israflı olduğu belirtilmelidir re.compile. Yukarıdaki eşleme yöntemi her çağrıldığında, normal ifade derlenecektir. Bu aynı zamanda diğer programlama dillerinde hatalı bir uygulamadır. Aşağıdakiler daha iyi bir uygulamadır.

Uygulama başlatma aşamasında:

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

Çalışma süresi işlemede:

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

1
Teşekkür ederim! Hiç kimse derleme hakkında konuşmaz, ancak bu en akıllı seçenektir!
StefanJCollier

2
OP tam anlamıyla bir çözüm için sorar gelmez kullanmak re.compile()....
wpercy

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

Büyük / küçük harfe duyarlı olmayan işlemler gerçekleştirmek için yeniden tedarik edin.

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

ve büyük / küçük harfle eşleşen metni değiştirmek istersek ...

>>> 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

Değiştirmek ama yine de önceki str tarzı tutmak istiyorsanız. Bu mümkün.

Örneğin: "test asdasd TEST asd tEst asdasd" dizesini vurgulayın.

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

Büyük / küçük harfe duyarlı olmayan normal ifade (Normal İfade) için: Kodunuza eklemenin iki yolu vardır:

  1. flags=re.IGNORECASE

    Regx3GList = re.search("(WCDMA:)((\d*)(,?))*", txt, **re.IGNORECASE**)
  2. Büyük / küçük harfe duyarlı olmayan işaret (?i)

    Regx3GList = re.search("**(?i)**(WCDMA:)((\d*)(,?))*", txt)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.