在Python中,如何使用正则表达式作为分隔符连接字符串列表,而不使用反斜杠字符转义
我试图将几个正则表达式与任意数量的空格连接起来,这些空格由变量定义在Python中,如何使用正则表达式作为分隔符连接字符串列表,而不使用反斜杠字符转义,python,regex,Python,Regex,我试图将几个正则表达式与任意数量的空格连接起来,这些空格由变量定义 SPACES = "\s*" 然而,如果我尝试 SPACES.join(['from','till']) 我明白了 'from\\s*till' 中间有一个额外的反斜杠字符。是否可以在不插入附加\的情况下使用join方法,从而在写入以下内容时,结果为“from\s*till”?: SPACES = "\s*" # not what you think Python试图转义s,但由于它不是一个有效的转义序列,因此它放弃并
SPACES = "\s*"
然而,如果我尝试
SPACES.join(['from','till'])
我明白了
'from\\s*till'
中间有一个额外的反斜杠字符。是否可以在不插入附加\的情况下使用join方法,从而在写入以下内容时,结果为“from\s*till”?:
SPACES = "\s*" # not what you think
Python试图转义s,但由于它不是一个有效的转义序列,因此它放弃并将整个字符串解释为\\s*。这样,您就依赖于一个极端情况,这使得您的代码很难理解。相反,您应该使用正确的形式:
SPACES = r"\s*" # same as "\\s*" and also shows intent
底线是'\s'不是正确的值,因此Python将始终将其转换为'\\s',因此在输出字符串中的任何位置都不会看到'\s'。除非在编写时将“from\s*till”解释为r字符串r“from\s*till”,否则您所期望的结果是不可能的。:
SPACES = "\s*" # not what you think
Python试图转义s,但由于它不是一个有效的转义序列,因此它放弃并将整个字符串解释为\\s*。这样,您就依赖于一个极端情况,这使得您的代码很难理解。相反,您应该使用正确的形式:
SPACES = r"\s*" # same as "\\s*" and also shows intent
底线是'\s'不是正确的值,因此Python将始终将其转换为'\\s',因此在输出字符串中的任何位置都不会看到'\s'。除非将“from\s*till”解释为r字符串r“from\s*till”,否则您所期望的结果是不可能的。您在打印时会得到“from\\s*till”,因为它不是有效的转义序列请参见有效的转义序列,因此Python假定您需要一个文本反斜杠,您可以这样做并转义它
无论哪种方式,最后一个字符串都是您需要的字符串,您可以通过检查lenSPACES.join['from','till']是否为11而不是12来验证这一点。您在打印时得到了'from\\s*till',因为它不是有效的转义序列请参见有效的转义序列,因此Python假定您需要一个文本反斜杠,然后转义它
无论哪种方式,最后一个字符串都是您需要的字符串,您可以通过检查lenSPACES.join['from','till']是否为11而不是12来验证这一点。您只是在观察字符串对象的uu repr_u_u与其u str_u_u表示之间的差异。前者以转义形式显示特殊字符,即可以/应该用于实例化同一字符串对象的文本形式,后者不:
> SPACES = "\s*"
> pat = SPACES.join(['ab', 'cd'])
> pat
'ab\\s*cd' # == repr(pat)
> print pat
ab\s*cd # == str(pat)
# re.match(pat, 'ab cd') matches as expected
正如在其他答案中所提到的,“\s”不是有效的转义序列,因此反斜杠被视为文字反斜杠,也可以被视为文字“\\”:
您只是在观察字符串对象的_repr_uuuuuu与其_str_uuuuu表示之间的差异。前者以转义形式显示特殊字符,即可以/应该用于实例化同一字符串对象的文本形式,后者不:
> SPACES = "\s*"
> pat = SPACES.join(['ab', 'cd'])
> pat
'ab\\s*cd' # == repr(pat)
> print pat
ab\s*cd # == str(pat)
# re.match(pat, 'ab cd') matches as expected
正如在其他答案中所提到的,“\s”不是有效的转义序列,因此反斜杠被视为文字反斜杠,也可以被视为文字“\\”:
如何“获取”该输出?空格=\s*无效Python@cricket_007-我很困惑,为什么它不应该是有效的?@Christian反斜杠在不是原始字符串时需要转义,对吗?@cricket_007我认为它只需要转义,如果它会打断字符串的末端,如空格=\-此反斜杠将跳过结尾,从而产生错误。但是原始空格=\s*适用于我的python 3.5.2,反斜杠会自动转义,因此空格包含“\\s*”,而printSPACES返回原始的\s*如何“获取”该输出?空格=\s*无效Python@cricket_007-我很困惑,为什么无效?@Christian反斜杠不是原始字符串时需要转义,对吗?@cricket\u 007我认为它只需要转义,如果它会打断字符串的结尾,比如空格=\-这个反斜杠会转义结尾,从而产生错误。但是原始空格=\s*适用于我的python 3.5.2,反斜杠会自动转义,因此空格包含“\\s*”,而printSPACES会返回原始的\s*。事实上,我是从iPython终端“获取”它的,它显示了“repr”表示。事实上,我是从iPython终端“获取”它的,它显示了_repr__表示。