Возможно, вы можете использовать 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
. , , только со всеми шестью варами там.
Вам нужно использовать это регулярное выражение, чтобы получить то, что вы хотите,
[^_]*_[^_]*\.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
, что не соответствует желаемому поведению.
Не уверен, соответствует ли это тому, что вы ищете концептуально как «не жадный справа» - но этот шаблон дает правильный ответ:
'[^_]+_[^_]+\.xml [^_]
соответствует классу символов любой символ, который не является подчеркиванием.
[^_]
соответствует классу символов любой символ, который не является подчеркиванием.
Ваш паттерн (_.+)?\.xml$
захватывает необязательную группу от первого подчеркивания до тех пор, пока он не может соответствовать .xml
в конце строки, и он не учитывает количество подчеркиваний, которое должно быть между ними.
Чтобы соответствовать только последней части, вы можете опустить группу захвата. Вы можете использовать отрицательный класс символов и использовать якорь $
, чтобы утверждать конец строки так, как она является последней частью:
[^_]+_[^_]+\.xml$
Regex demo | Демонстрация Python
Это будет соответствовать
[^_]+
Соответствие 1+ раз не _ _
Соответствие буквально [^_]+
Соответствовать 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())