当前位置: 首页 > 面试题库 >

Python Regex子-使用Match作为替换中的Dict键

厉永宁
2023-03-14
问题内容

我正在将程序从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,那么应该看一下该 函数。