Найти - Пользователи
Полная версия: Не очень красивое решение
Начало » Python для новичков » Не очень красивое решение
1 2 3
asilyator
А не проще было бы все-таки сделать одну?
py.user.next
>>> 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)
>>>
если .match() убрать, то нужно перекомпилировать шаблон

представь, что у тебя много шаблонов, а поиск нужно вести где-то в начале строки, а где-то по всей строке
и ты тогда должен делать две копии шаблонов
PooH
py.user.next
если .match() убрать, то нужно перекомпилировать шаблон
представь, что у тебя много шаблонов, а поиск нужно вести где-то в начале строки, а где-то по всей строке
и ты тогда должен делать две копии шаблонов

Честно говоря, аргумент выглядит притянутым за уши. Я вот тоже никогда не мог понять причины появления двух функций.
py.user.next
PooH
Честно говоря, аргумент выглядит притянутым за уши.
нормальный аргумент, предлагаешь делать две копии одного шаблона ?
один - для поиска по всей строке, второй - для поиска только в начале
и потом их ещё компилировать в два regex-объекта
PooH
py.user.next
один - для поиска по всей строке, второй - для поиска только в начале
и потом их ещё компилировать в два regex-объекта
можно finditer и посмотреть pos у match object.

но, собственно смущает то другое, какая, например, задача приведет к такому?
py.user.next
представь, что у тебя много шаблонов, а поиск нужно вести где-то в начале строки, а где-то по всей строке
а как часто она возникает?
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
но, собственно смущает то другое, какая, например, задача приведет к такому?
есть набор шаблонов для слов и есть тексты
в одном надо искать эти слова по всей строке текста
в другом надо искать эти слова в первой колонке
для одного ты применяешь .search(), для другого .match()
и ничего не надо проверять

PooH
а как часто она возникает?
с разными программами это удобно, если ищешь в начале, не надо в каждом шаблоне проставлять каретку
и при этом возможность поиска в начале строки сохраняется
asilyator
py.user.next
есть набор шаблонов для слов и есть тексты
в одном надо искать эти слова по всей строке текста
в другом надо искать эти слова в первой колонке
И как часто такая необходимость возникает?

PooH
а как часто она возникает?
Вот у нас и мысли сошлись.

py.user.next
с разными программами это удобно, если ищешь в начале, не надо в каждом шаблоне проставлять каретку
и при этом возможность поиска в начале строки сохраняется
Задача не очень типичная и вполне решаема другим способом.

py.user.next
они различаются

>>> 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’
>>>
Есть еще \A и \Z, какой-то из них должен работать.
py.user.next
asilyator
И как часто такая необходимость возникает?
поиск в начале строки возникает часто и поиск по всей строке возникает часто
ты не делаешь новый шаблон и не делаешь обходное решение
в питоне регулярные выражения часто компилируются - вводить шаблон затратнее

asilyator
Есть еще \A и \Z, какой-то из них должен работать.
меняется поиск для .search() тогда, и опять нужно два шаблона
asilyator
py.user.next
поиск в начале строки возникает часто и поиск по всей строке возникает часто
А как часто нужны два варианта поиска с одним шаблоном? У меня еще ни разу.

py.user.next
ты не делаешь новый шаблон и не делаешь обходное решение
Нет, только засоряешь api.

py.user.next
в питоне регулярные выражения часто компилируются - вводить шаблон затратнее
Они везде компилируются в конечный автомат.
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
Нет, только засоряешь api.
попробуй не пользоваться .match()

asilyator
Они везде компилируются в конечный автомат.
есть функция re.compile(), она сделана для компилирования шаблонов
если ты её используешь, то каждый новый шаблон нужно будет компилировать
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB