не жадное регулярное выражение Python от конца строки

Возможно, вы можете использовать itertools.product: http://docs.python.org/library/itertools.html#itertools.product .

Что-то вроде

for var1, var2 in itertools.product(xrange(min1, max1, step1), xrange(min2, max2, step2)):
    # stuff

. , , только со всеми шестью варами там.

1
задан manuel_b 5 March 2019 в 16:44
поделиться

3 ответа

Вам нужно использовать это регулярное выражение, чтобы получить то, что вы хотите,

[^_]*_[^_]*\.xml

Демо

Проверьте этот код Python, [ 1113]

import re

arr = ['AB_x-y-z_XX1234567890_84481.xml','x-y-z_XX1234567890_84481.xml','XX1234567890_84481.xml']

for s in arr:
 m = re.search(r'[^_]*_[^_]*\.xml', s)
 if (m):
  print(m.group(0))

Prints,

XX1234567890_84481.xml
XX1234567890_84481.xml
XX1234567890_84481.xml

Проблема в вашем регулярном выражении (_.+)?\.xml$ состоит в том, что часть (_.+)? начнет совпадать с первого _ и будет сопоставлять что угодно, пока не увидит литерал .xml и все это тоже необязательно, за ним следует ?. Благодаря этому в строке _x-y-z_XX1234567890_84481.xml он также будет соответствовать _x-y-z_XX1234567890_84481, что не соответствует желаемому поведению.

0
ответ дан Pushpesh Kumar Rajwanshi 5 March 2019 в 16:44
поделиться

Не уверен, соответствует ли это тому, что вы ищете концептуально как «не жадный справа» - но этот шаблон дает правильный ответ:

'[^_]+_[^_]+\.xml 

[^_] соответствует классу символов любой символ, который не является подчеркиванием.

[^_] соответствует классу символов любой символ, который не является подчеркиванием.

0
ответ дан knap 5 March 2019 в 16:44
поделиться

Ваш паттерн (_.+)?\.xml$ захватывает необязательную группу от первого подчеркивания до тех пор, пока он не может соответствовать .xml в конце строки, и он не учитывает количество подчеркиваний, которое должно быть между ними.

Чтобы соответствовать только последней части, вы можете опустить группу захвата. Вы можете использовать отрицательный класс символов и использовать якорь $, чтобы утверждать конец строки так, как она является последней частью:

[^_]+_[^_]+\.xml$

Regex demo | Демонстрация Python

Это будет соответствовать

  • [^_]+ Соответствие 1+ раз не _
  • _ Соответствие буквально
  • [ 1113] [^_]+ Соответствовать 1+ раз, а не _
  • \.xml$ Соответствовать .xml в конце строки

Например:

import re

test1 = 'AB_x-y-z_XX1234567890_84481.xml'
result = re.search('[^_]+_[^_]+\.xml, test1, re.I)
if result:
    print(result.group())
0
ответ дан The fourth bird 5 March 2019 в 16:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: