【发布时间】:2018-03-21 19:37:26
【问题描述】:
我想利用用户输入来匹配和重新排列字符串。 在 Perl 中,一个简单的示例如下所示:
use strict;
my $str = 'abc123def456ghi';
my $user_input1 = '(\d+).+?(\d+)';
my $user_input2 = '$2.$1';
if ($str =~ /$user_input1/) {
my $newstr = eval($user_input2);
print $newstr;
}
else {print "No match..."};
原则上同样适用于 Python:
import re
mystr = 'abc123def456ghi'
user_input1 = '(\d+).+?(\d+)'
user_input2 = 'm.group(2) + m.group(1)'
m = re.search(user_input1,mystr)
if m:
newstr = eval(user_input2)
print (newstr)
else: print ("No match...")
结果:456123
不过,'m.group(1)' 和 'm.group(2)' 表达式对于用户来说不是很友好,如果您必须在输入字段中输入多次。
因此,我想知道在 Python 中是否有类似的紧凑表达式,如 Perl 中的 '$1' '$2'?
我无法使用'\1' 和'\2' 在Python 中工作。
有什么想法吗?
编辑:
对不起,我在下面的一些 cmets 之后尝试解释:
我正在尝试eval(),因为它似乎可以与m.group(1) 等一起使用。
但显然由于某种原因r'\1' 等在eval() 中不被接受
import re
mystr = 'abc123def456ghi'
user_input1 = r'(\d+).+?(\d+)'
user_input2 = r'\2\1'
newstr = eval(user_input2)
print (newstr)
结果
SyntaxError: unexpected character after line continuation character
关于使用 re.sub() 的建议
它不应该是简单的字符串替换,而是重新排列+匹配的添加。 如果我修改原来的正则表达式
user_input1 = r'(.+?)(\d+).+?(\d+)(.+)'
我可以使用user_input2 = r'\3\2'
但是,例如如果我想在匹配之间添加“999”(当然,r'\3999\2' 或 r'\3+"999"+\2' 都不会这样做),那么我可能会回来使用 eval() 和 m.group(1) 等,尽管我想保持用户输入为尽可能简短。也许,我可以使用一些建议的替换。
【问题讨论】:
-
你为什么使用
eval? -
你总是可以写例如
g = m.group然后为组执行g(1)、g(2)。然后,您甚至可以在 f 字符串中执行{g(1)}等。但真的没有理由这样做。您只需键入一次,但会阅读数百次,因此可读性远比节省几次击键更重要。 -
你不应该使用
eval。你应该使用this。 -
“我无法正常工作”是什么意思?向我们展示您调用
re.sub或m.expand或其他任何名称的代码,我们可能会告诉您您做错了什么,但不知道您尝试了什么或发生了什么,任何人都只能说您一定做了什么哪里出错了。 -
我要冒昧地说这是stackoverflow.com/questions/20765265/…的复制品