我正在将程序从Perl转换为Python(3.3)。我对Python相当陌生。在Perl中,我可以巧妙地进行正则表达式替换,例如:
$string =~ s/<(\w+)>/$params->{$1}/g;
这将搜索$string
,对于包含在<>中的每组单词字符,$params
将使用正则表达式匹配作为哈希键,从hashref中进行替换。
简洁地复制此行为的最佳(Pythonic)方法是什么?我提出了以下思路:
string = re.sub(r'<(\w+)>', (what here?), string)
如果我可以传递一个将正则表达式匹配映射到字典的函数,那可能会很好。那可能吗?
谢谢您的帮助。
您可以传递一个callable来re.sub
告诉它如何处理match对象。
s = re.sub(r'<(\w+)>', lambda m: replacement_dict.get(m.group()), s)
dict.get
如果说的字词不在替换字典中,则使用允许您提供“备用”,即
lambda m: replacement_dict.get(m.group(), m.group())
# fallback to just leaving the word there if we don't have a replacement
我会注意到,在使用re.sub
(和系列,即re.split
)时,指定所需替换 周围
存在的内容时,使用环顾四周表达式通常会更干净,以免匹配周围的内容被淡化。所以在这种情况下,我会像这样写你的正则表达式
r'(?<=<)(\w+)(?=>)'
否则,您必须在的括号中进行一些拼接/切入lambda
。为了弄清楚我在说什么,举一个例子:
s = "<sometag>this is stuff<othertag>this is other stuff<closetag>"
d = {'othertag': 'blah'}
#this doesn't work because `group` returns the whole match, including non-groups
re.sub(r'<(\w+)>', lambda m: d.get(m.group(), m.group()), s)
Out[23]: '<sometag>this is stuff<othertag>this is other stuff<closetag>'
#this output isn't exactly ideal...
re.sub(r'<(\w+)>', lambda m: d.get(m.group(1), m.group(1)), s)
Out[24]: 'sometagthis is stuffblahthis is other stuffclosetag'
#this works, but is ugly and hard to maintain
re.sub(r'<(\w+)>', lambda m: '<{}>'.format(d.get(m.group(1), m.group(1))), s)
Out[26]: '<sometag>this is stuff<blah>this is other stuff<closetag>'
#lookbehind/lookahead makes this nicer.
re.sub(r'(?<=<)(\w+)(?=>)', lambda m: d.get(m.group(), m.group()), s)
Out[27]: '<sometag>this is stuff<blah>this is other stuff<closetag>'
我在替换所有
问题内容: var textTitle = “this is a test” var result = textTitle.replace(‘ ‘, ‘%20’); 但是替换功能在“”的第一个实例处停止,我得到了 结果: 任何关于我哪里出问题的想法都确保它很简单。 问题答案: 您需要在那里,像这样:
问题内容: 考虑一下,数据框: 我想按列将其拆分成字典,像这样: 我发现使用的解决方案是: 还有哪些其他解决方案? 问题答案: 您可以在/上使用/应用:
问题内容: 在Python(2.7)中,有没有更简单的方法可以做到这一点?:注意:这并不是什么花哨的事情,就像将所有局部变量放入字典一样。只是我在列表中指定的那些。 问题答案:
问题内容: 我在上课时遇到了麻烦。我在Raspbian(Raspberry Pi的Debian发行版)上使用Python 2.7。我正在尝试打印两个字典,以便进行文本冒险的比较(并排)。该顺序对于准确比较至关重要。无论我尝试什么,词典都以通常的无序方式打印。 这是我在RPi上执行的操作所得到的: 显然有些不对劲,因为它正在打印函数调用并将键和值组放入嵌套列表中。 这是通过在PC上运行类似内容得到的
问题内容: 我想用%20替换url中所有空格实例。我将如何使用正则表达式呢? 谢谢! 问题答案: 如果您只想用另一个字符串替换这里的字符串,则不需要正则表达式:using 应该绰绰有余: 但是,如果您想要的还不止于此,并且可能要这样做,并且您正在使用URL,那么应该看一下该 函数。