Сначала нужно проверить совпадение, а затем использовать группы. Т.е.
match()
совпадения только в начало строки, т. е. с неявным ^
якорем search()
совпадает в любом месте строки # works with Python 2 and Python 3
import re
with open('dummy.txt', 'r') as fh:
for rec in fh:
orec = ' rec: >' + rec.rstrip('\n') + '<'
print(orec)
match = re.match(r'XA([0-9]+)=(.*?[^#])!', rec)
if match:
(index, dvalue) = match.groups()
print(" index = >{}< value = >{}<".format(index, dvalue))
continue
match = re.match(r'PZ([0-9]+)=(.*?[^#])!', rec)
if match:
(index, dvalue) = match.groups()
print(" index = >{}< value = >{}<".format(index, dvalue))
continue
print(" Unknown Record format")
Вывод:
$ python dummy.py
rec: >DUD=ABC!QUEUE=D23!<
Unknown Record format
rec: >XA32=7!P^=32!<
index = >32< value = >7<
rec: >PZ112=123^!PQ=ABC!<
index = >112< value = >123^<
Но Мне интересно, почему вы не упрощаете свой Perl & amp; код Python просто использовать один регулярное выражение, вместо этого? E.g.:
match = re.match(r'(?:XA|PZ)([0-9]+)=(.*?[^#])!', rec)
if match:
(index, dvalue) = match.groups()
print(" index = >{}< value = >{}<".format(index, dvalue))
else:
print(" Unknown Record format")
Я предполагаю, что Вы имеете в виду "аргумент ключевого слова", когда Вы говорите "названный параметром". dict.pop()
не принимает аргумент ключевого слова, таким образом, эта часть вопроса спорна.
>>> {}.pop('test', d=None)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: pop() takes no keyword arguments
Тем не менее способ обнаружить, был ли аргумент обеспечен, состоит в том, чтобы использовать *args
или **kwargs
синтаксис. Например:
def foo(first, *rest):
if len(rest) > 1:
raise TypeError("foo() expected at most 2 arguments, got %d"
% (len(rest) + 1))
print 'first =', first
if rest:
print 'second =', rest[0]
С некоторой работой и использованием **kwargs
синтаксис также возможно полностью эмулировать соглашение о вызовах Python, где аргументы могут быть или обеспечены положением или по имени, и аргументы, обеспеченные многократно (положением и именем), вызывают ошибку.
Конвенция состоит в том, чтобы часто использовать arg=None
и использование
def foo(arg=None):
if arg is None:
arg = "default value"
# other stuff
# ...
, чтобы проверить, было ли это передано или нет. Разрешение пользователю передать None
, который был бы интерпретирован, как будто аргумент был не , передало.
Можно сделать это как это:
def isdefarg(*args):
if len(args) > 0:
print len(args), "arguments"
else:
print "no arguments"
isdefarg()
isdefarg(None)
isdefarg(5, 7)
См. документацию Python относительно вызовы для полной информации.
def f(one, two=2):
print "I wonder if", two, "has been passed or not..."
f(1, 2)
, Если это - точное значение Вашего вопроса, я думаю, что нет никакого способа различать 2, который был в значении по умолчанию и 2, который был передан. Я не нашел, как выполнить такое различие даже в эти , осматривают модуль.
Я не уверен, понимаю ли я полностью то, что это, Вы хотите; однако:
def fun(arg=Ellipsis):
if arg is Ellipsis:
print "No arg provided"
else:
print "arg provided:", repr(arg)
, который делает то, что Вы хотите? В противном случае затем как другие предположили, необходимо объявить функцию с *args, **kwargs
синтаксис и зарегистрироваться в kwargs dict для существования параметра.