在正则表达式中使用变量的麻烦

时间:2018-04-12 03:53:50

标签: python regex

我已经看过了: how to use a variable inside a regular expression

这是我的代码:

import re

#take user input as an argument
print('Enter 1st Argument: value to strip.')

user_input = input()

#take value to strip off as another argument
print('Enter 2nd Argument: The value to strip off the 1st value.')

strip_value = input()

#Recreate Strip Function
def regex_strip(value,what_to_strip):

     thing2 = 'L'
     what_to_strip = re.compile(r + re.escape(thing2))
     print(what_to_strip)
    #fv = what_to_strip.search('tigers named L')
    #print(fv.group())

regex_strip(user_input, strip_value)

我希望用户提交两个值。第一个值是将要剥离的值。第二个值是被剥离的值。

在我的函数中,我是硬编码值以测试我的正则表达式。

我收到错误消息:

  

名称'r'未定义

我做错了什么?

编辑#1:这就是我的尝试:

thing2 = '\d'
what_to_strip = re.compile(re.escape(thing2))
print(what_to_strip)
fv = what_to_strip.search('123')
print(fv.group())

结果:

  

'NoneType'对象没有属性'group'

我的想法:thing2 = '\d'出了点问题 我只想'\d',但我得到'\\\\d'嗯。

2 个答案:

答案 0 :(得分:1)

您可以跳过转义功能:

what_to_strip = re.compile(thing2)

:)

答案 1 :(得分:1)

第一个问题是您将原始字符串文字与字符串混淆。字符串文字是在Python源代码中输入字符串的方式,如"abc"。您可以使用r前缀将其设为原始字符串文字,例如r"a\b\c"。这不会改变它是什么类型的字符串,它只是阻止应用通常的Python源代码规则,因此您获得实际的反斜杠和字母而不是像退格一样的特殊字符。因此,您无法将用户输入转换为原始字符串,但您不必 - 字符串已经完全是用户键入的字母。

(这可能有点令人困惑,因为当你打印出正则表达式时,你会看到像re.compile(r'\.', re.UNICODE)这样的东西。r实际上并不是对象的一部分;它会告诉你如何可以在源代码中创建完全相同的正则表达式对象。)

re.escape函数有点类似,但它不是一回事。它的作用是采用正则表达式模式并将其转换为另一种模式,其中所有正则表达式特殊字符都被转义。因此,例如,re.escape('.')会为您提供\.,这意味着它只匹配实际的.字符,而不是匹配任何内容。由于用户输入可以轻松包含.等字符,并且用户可能不会要求您删除每个字符,因此您在此处使用re.escape是正确的。

所以:

re.compile(re.escape(thing2))

当您使用输入\d测试此代码并尝试搜索字符串123时,它找不到任何内容。但这正是你想要的。如果用户输入\d,他们就不会要求删除任何数字,他们会要求删除\d

当然对于某些程序,您确实想要从用户那里获取正则表达式。 (例如,您可能希望编写与grep类似的内容。)在这种情况下,您不会调用re.escape

最后一件事:当您致电'1234'.strip('14')时,不会从两边剥去字符串'14',它会删除字符串'14'中的所有字符 - 换句话说,你会回来23。要使用正则表达式进行此操作,您需要将'14'转换为'1|4'。换句话说,你想要转义每个角色,然后用'|'加入这些角色,以获得模式。