Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中,如何使用正则表达式作为分隔符连接字符串列表,而不使用反斜杠字符转义_Python_Regex - Fatal编程技术网

在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__表示。