Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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,假设我有这样一个字符串: s = '((Xyz_lk) some stuff (XYZ_l)) (and even more stuff (XyZ))' 我只想删除单个单词周围的括号,以便获得: '(Xyz_lk some stuff XYZ_l) (and even more stuff XyZ)' 在Python中如何实现这一点?到目前为止,我只通过使用 re.sub('\(\w+\)', '', s) 给 '( some stuff ) (and even more stuff )'

假设我有这样一个字符串:

s = '((Xyz_lk) some stuff (XYZ_l)) (and even more stuff (XyZ))'
我只想删除单个单词周围的括号,以便获得:

'(Xyz_lk some stuff XYZ_l) (and even more stuff XyZ)'
在Python中如何实现这一点?到目前为止,我只通过使用

re.sub('\(\w+\)', '', s)

'( some stuff ) (and even more stuff )'
我怎样才能删除括号并将文本保留在括号内

re.sub(r'\((\w+)\)',r'\1',s)

使用
\1
或反向引用。

您可以使用反向引用(实际上是在
子功能中,他们称之为组引用号):

有关更多信息,请阅读以下关于反向引用的说明:

反向引用与先前由捕获组匹配的文本相同。假设您希望匹配一对开始和结束HTML标记,以及中间的文本。通过将开始标记放入backreference,我们可以将标记的名称重新用于结束标记。方法如下:
]*>.*?
。此正则表达式只包含一对括号,用于捕获由
[A-Z][A-Z0-9]*
匹配的字符串。这是开始的HTML标记。(由于HTML标记不区分大小写,因此此正则表达式需要不区分大小写的匹配。)反引用
\1
(反斜杠1)引用第一个捕获组<代码>\1
与第一个捕获组匹配的文本完全相同。前面的
/
是文字字符。我们试图匹配的只是结束HTML标记中的正斜杠


谢谢很好。为什么需要\b?在vks的回答中,不包括这些内容。有什么具体原因吗?我对答案投了赞成票,因为它回答了问题。由于
\w
的性质,边界是多余的,即无论正则表达式中是否包含边界,效果都是一样的。然而,一般来说使用它们是很好的@Cleb,from
pydoc re
\b-匹配空字符串,但仅在单词的开头或结尾处匹配。
@Cleb简而言之,单词边界强制您的正则表达式引擎只匹配由正则表达式在中生成的串联字符。在这种情况下\w read more Werkriter是对的,您在这种情况下不需要单词边界case@Kasra:好的,谢谢你的澄清。您介意详细说明\1的工作原理吗?在这个话题上没有太多经验…@Kasra:太好了,谢谢!我投了你的票,但会接受vks的回答,因为他稍微快一点。谢谢你的帮助!谢谢,很好用!Kasra在回答中使用了\b。你为什么不用它?我对你的答案投了赞成票,因为它运行良好。@Cleb我们不需要它,因为
\b
是单词边界,
\w
将只匹配单词,我们有
()
围绕它。所以我们一点也不需要它,谢谢你的澄清。您介意详细说明\1的工作原理吗?在这个主题上没有太多经验…@Cleb
\1
存储
()
中的任何内容。在
()
中,我们有
\w+
。所以这个词被存储在
\1
中。现在你用
\1
替换了整个词。所以这个词被替换了。你稍微快一点,所以我接受你的。谢谢你的帮助!
>>> s='((Xyz_lk) some stuff (XYZ_l)) (and even more stuff (XyZ))'
>>> 
>>> re.sub(r'\((\w+)\)',r'\1',s)
'(Xyz_lk some stuff XYZ_l) (and even more stuff XyZ)'
>>>