>>> import re >>> p = re.compile('.a.') >>> p.search('1a1234a1234') <_sre.SRE_Match object at 0xb75cfec8> >>> p.match('1a1234a1234') <_sre.SRE_Match object at 0xb75cff38> >>> p.search('1a1234a1234', 1) <_sre.SRE_Match object at 0xb75cfe90> >>> p.match('1a1234a1234', 1) >>>
py.user.next
если .match() убрать, то нужно перекомпилировать шаблон
представь, что у тебя много шаблонов, а поиск нужно вести где-то в начале строки, а где-то по всей строке
и ты тогда должен делать две копии шаблонов
PooHнормальный аргумент, предлагаешь делать две копии одного шаблона ?
Честно говоря, аргумент выглядит притянутым за уши.
py.user.nextможно finditer и посмотреть pos у match object.
один - для поиска по всей строке, второй - для поиска только в начале
и потом их ещё компилировать в два regex-объекта
py.user.nextа как часто она возникает?
представь, что у тебя много шаблонов, а поиск нужно вести где-то в начале строки, а где-то по всей строке
PooHтогда проще скомпилировать другой шаблон
можно finditer и посмотреть pos у match object.
>>> import re >>> p = re.compile('.a.') >>> next(p.finditer('1a11a1bc')).pos 0 >>>
>>> next(p.finditer('1b11b1bc')).pos Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration >>>
PooHесть набор шаблонов для слов и есть тексты
но, собственно смущает то другое, какая, например, задача приведет к такому?
PooHс разными программами это удобно, если ищешь в начале, не надо в каждом шаблоне проставлять каретку
а как часто она возникает?
py.user.nextИ как часто такая необходимость возникает?
есть набор шаблонов для слов и есть тексты
в одном надо искать эти слова по всей строке текста
в другом надо искать эти слова в первой колонке
PooHВот у нас и мысли сошлись.
а как часто она возникает?
py.user.nextЗадача не очень типичная и вполне решаема другим способом.
с разными программами это удобно, если ищешь в начале, не надо в каждом шаблоне проставлять каретку
и при этом возможность поиска в начале строки сохраняется
py.user.nextЕсть еще \A и \Z, какой-то из них должен работать.
они различаются
>>> re.search(r'^….$', ‘abc\ndefg\nhijk’, re.M).group()
'defg'
>>> re.match(r'^….$', ‘abc\ndefg\nhijk’, re.M).group()
Traceback (most recent call last):
File “<stdin>”, line 1, in <module>
AttributeError: ‘NoneType’ object has no attribute ‘group’
>>>
asilyatorпоиск в начале строки возникает часто и поиск по всей строке возникает часто
И как часто такая необходимость возникает?
asilyatorменяется поиск для .search() тогда, и опять нужно два шаблона
Есть еще \A и \Z, какой-то из них должен работать.
py.user.nextА как часто нужны два варианта поиска с одним шаблоном? У меня еще ни разу.
поиск в начале строки возникает часто и поиск по всей строке возникает часто
py.user.nextНет, только засоряешь api.
ты не делаешь новый шаблон и не делаешь обходное решение
py.user.nextОни везде компилируются в конечный автомат.
в питоне регулярные выражения часто компилируются - вводить шаблон затратнее
asilyatorкак ты используешь шаблоны ?
А как часто нужны два варианта поиска с одним шаблоном? У меня еще ни разу.
import re pat = r'(\b[a-z]+\b)' # подходящая строка s1 = 'abcd 1234 defg' # неподходящая строка s2 = '[ abcd 1234 defg ]' mo = re.match(pat, s1) if mo: print(1, mo.group(1)) mo = re.match(pat, s2) if mo: print(1, mo.group(1)) # подходящая строка s1 = '[ 1234 abcd 5678 ]' # неподходящая строка s2 = '[ 1234 5678 1234 ]' mo = re.search(pat, s1) if mo: print(2, mo.group(1)) mo = re.search(pat, s2) if mo: print(2, mo.group(1))
asilyatorпопробуй не пользоваться .match()
Нет, только засоряешь api.
asilyatorесть функция re.compile(), она сделана для компилирования шаблонов
Они везде компилируются в конечный автомат.