我已经看过了: 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'
嗯。
答案 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'
。换句话说,你想要转义每个角色,然后用'|'
加入这些角色,以获得模式。