Python 在正则表达式中使用变量时遇到问题

Python 在正则表达式中使用变量时遇到问题,python,regex,Python,Regex,我已经看过了: 以下是我的代码: 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_va

我已经看过了:

以下是我的代码:

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())
结果:

“非类型”对象没有属性“组”

我的想法是:
thing2='\d'

我只想要
'\d'
,但我得到了
'\\\\d'
hmm.

您可以跳过转义函数:

what_to_strip = re.compile(thing2)

:)

您可以跳过转义功能:

what_to_strip = re.compile(thing2)

:)

第一个问题是将原始字符串文字与字符串混淆。字符串文字是在Python源代码中输入字符串的方式,如
“abc”
。您可以使用
r
前缀使其成为原始字符串文字,如
r“a\b\c”
。这并没有改变字符串的类型,它只是阻止应用通常的Python源代码规则,所以您得到的是实际的反斜杠和字母,而不是像反斜杠这样的特殊字符。因此,您不能将用户输入转换为原始字符串,但不必确保字符串已经与用户键入的字母完全一致

(这可能有点令人困惑,因为当您打印正则表达式时,您会看到类似于
re.compile(r'\',re.UNICODE)
的内容。
r
实际上不是对象的一部分;它向您展示了如何在源代码中创建完全相同的正则表达式对象。)


re.escape
函数有点类似,但不是一回事。它所做的是将一个正则表达式模式转换成另一个模式,并转义所有正则表达式特殊字符。例如,
re.escape('.')
为您提供了
\.
,这意味着它将只匹配实际的
字符,而不是匹配任何字符。由于用户输入可以很容易地包含像
这样的字符,并且用户可能没有要求您删除每个字符,因此您在此处使用
re.escape
是正确的

因此:


当您使用输入
\d
测试此代码并尝试搜索字符串
123
时,它没有找到任何内容。但那正是你想要的。如果用户键入
\d
,他们不是要求去掉任何数字,而是要求去掉
\
d

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



最后一件事:当您调用
'1234'时,strip('14')
,它不会从两侧剥离字符串
'14
,它会剥离字符串
'14'
中的任何字符-按顺序排列,您将返回
23
。要使用正则表达式执行此操作,需要将
'14'
转换为
'1 | 4'
。换句话说,您希望对每个字符进行转义,然后将这些字符与
“|”
连接起来,以获得模式。

第一个问题是将原始字符串文字与字符串混淆。字符串文字是在Python源代码中输入字符串的方式,如
“abc”
。您可以使用
r
前缀使其成为原始字符串文字,如
r“a\b\c”
。这并没有改变字符串的类型,它只是阻止应用通常的Python源代码规则,所以您得到的是实际的反斜杠和字母,而不是像反斜杠这样的特殊字符。因此,您不能将用户输入转换为原始字符串,但不必确保字符串已经与用户键入的字母完全一致

(这可能有点令人困惑,因为当您打印正则表达式时,您会看到类似于
re.compile(r'\',re.UNICODE)
的内容。
r
实际上不是对象的一部分;它向您展示了如何在源代码中创建完全相同的正则表达式对象。)


re.escape
函数有点类似,但不是一回事。它所做的是将一个正则表达式模式转换成另一个模式,并转义所有正则表达式特殊字符。例如,
re.escape('.')
为您提供了
\.
,这意味着它将只匹配实际的
字符,而不是匹配任何字符。由于用户输入可以很容易地包含像
这样的字符,并且用户可能没有要求您删除每个字符,因此您在此处使用
re.escape
是正确的

因此:


当您使用输入
\d
测试此代码并尝试搜索字符串
123
时,它没有找到任何内容。但那正是你想要的。如果用户键入
\d
,他们不是要求去掉任何数字,而是要求去掉
\
d

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


最后一件事:当您调用
'1234'时,strip('14')
,它不会从两侧剥离字符串
'14
,它会剥离字符串
'14'
中的任何字符-按顺序排列,您将返回
23
。要使用正则表达式执行此操作,需要将
'14'
转换为
'1 | 4'
。换句话说,您希望转义每个字符,然后将这些字符与
“|”
连接起来,以获得模式。

re.compile(r+re.escape(thing2))