В python как «если finditer (...) не имеет совпадений»? - PullRequest
1 голос
/ 09 мая 2019

Я хотел бы что-то сделать, когда finditer () ничего не находит.

import re
pattern = "1"
string = "abc"  
matched_iter = re.finditer(pattern, string)
# <if matched_iter is empty (no matched found>.
#   do something.
# else
    for m in matched_iter:
        print m.group()

Лучшее, что я могу придумать, это отслеживать найденные вручную:

mi_no_find = re.finditer(r'\w+',"$$%%%%")   # not matching.
found = False
for m in mi_no_find:
    print m.group()
    found = True
if not found:
    print "Nothing found"

Похожие сообщения, которые не отвечают:

[править]
- Я не заинтересован в подсчете или подсчете общего объема производства. Только если найдены другие не найденные действия.
- Я понимаю, что могу добавить finditer в список, но это неэффективно для больших строк. Одной из целей является низкое использование памяти.

Ответы [ 2 ]

3 голосов
/ 09 мая 2019

Вы можете проверить итератор с помощью next, а затем chain результатов вместе, за исключением StopIteration, что означает, что итератор был пуст:

import itertools as it

matches = iter([])
try:
    probe = next(matches)
except StopIteration:
    print('empty')
else:
    for m in it.chain([probe], matches):
        print(m)

Что касается вашего решения, вы можете проверить m напрямую, предварительно установив None:

matches = iter([])
m = None
for m in matches:
    print(m)
if m is None:
    print('empty')
3 голосов
/ 09 мая 2019

Если производительность не является проблемой, просто используйте findall или list(finditer(...)), которая возвращает список.

В противном случае, вы можете «заглянуть» в генератор с помощью next, а затем выполнить цикл как обычно, если он повысит StopIteration. Хотя есть и другие способы сделать это, для меня это самый простой:

import itertools
import re

pattern = "1"
string = "abc"  
matched_iter = re.finditer(pattern, string)

try:
    first_match = next(matched_iter)
except StopIteration:
    print("No match!") # action for no match
else:
    for m in itertools.chain([first_match], matched_iter):
        print(m.group())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...