Ответ 1
Передайте re.IGNORECASE
параметру flags
search
, match
или sub
:
re.search('test', 'TeSt', re.IGNORECASE)
re.match('test', 'TeSt', re.IGNORECASE)
re.sub('test', 'xxxx', 'Testing', flags=re.IGNORECASE)
В 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
) в документации.
Передайте re.IGNORECASE
параметру flags
search
, match
или sub
:
re.search('test', 'TeSt', re.IGNORECASE)
re.match('test', 'TeSt', re.IGNORECASE)
re.sub('test', 'xxxx', 'Testing', flags=re.IGNORECASE)
Вы также можете выполнять поиск без учета регистра, используя поиск/совпадение без флага IGNORECASE (тестируется в Python 2.7.3):
re.search(r'(?i)test', 'TeSt').group() ## returns 'TeSt'
re.match(r'(?i)test', 'TeSt').group() ## returns 'TeSt'
Нечувствительный к регистру маркер (?i)
может быть включен непосредственно в шаблон регулярного выражения:
>>> import re
>>> s = 'This is one Test, another TEST, and another test.'
>>> re.findall('(?i)test', s)
['Test', 'TEST', 'test']
Вы также можете определить нечувствительность к регистру во время компиляции шаблона:
pattern = re.compile('FIle:/+(.*)', re.IGNORECASE)
#'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'>
В импорте
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'):
Для выполнения операций без учета регистра поставьте 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'
Используя sub, вы можете указать строку, которую вы хотите отфильтровать, как в вашем примере, для DOCTYPE и просто заменить ее для любой нужной строки. В приведенном ниже примере я заменяю все между тегами абзаца.
import re
htmlstring = '''
<!DOCTYPE html>
<html>
<body>
<p>This is a paragraph.</p>
<p>This is a paragraph.</p>
<p>This is a paragraph.</p>
</body>
</html>'''
stringlist = re.findall('<p>.*</p>', htmlstring, re.IGNORECASE)
for s in stringlist:
print re.sub('<p>.*</p>','<p>new string</p>',s)
>> <p>new string</p>
>> <p>new string</p>
>> <p>new string</p>
Или вы можете использовать:
stringlist = re.findall('<p>.*</p>', htmlstring, re.IGNORECASE)
for s in stringlist:
print s.replace(s, '<p>new string</p>')