正则表达式在python中括号内的所有字符周围添加空格

正则表达式在python中括号内的所有字符周围添加空格,python,regex,Python,Regex,我的目标是在括号之间分隔破折号。例如:美国侦探Queen先生,EQ,英国侦探Holmes先生 我希望结果是 皇后先生-美国侦探,EQ,霍姆斯先生-英国侦探 我的代码是 re.sub(r'(.*)(\(.*)(-)(.*\))(.*)', r'\1\2 \3 \4\5', String) 但是,这段代码似乎只分隔字符串最后一个括号中的最后一个破折号 它给出的结果是“美国侦探皇后先生,EQ,英国侦探霍姆斯先生” 有人能帮忙吗?我试图在这里找到出路;但我的代码似乎应该按照我预期的方式工作此代码将任务

我的目标是在括号之间分隔破折号。例如:美国侦探Queen先生,EQ,英国侦探Holmes先生

我希望结果是

皇后先生-美国侦探,EQ,霍姆斯先生-英国侦探

我的代码是

re.sub(r'(.*)(\(.*)(-)(.*\))(.*)', r'\1\2 \3 \4\5', String)
但是,这段代码似乎只分隔字符串最后一个括号中的最后一个破折号

它给出的结果是“美国侦探皇后先生,EQ,英国侦探霍姆斯先生”


有人能帮忙吗?我试图在这里找到出路;但我的代码似乎应该按照我预期的方式工作

此代码将任务分为两部分

它在字符串目标中搜索由。。。 然后,它搜索并替换每个-在每个找到的空间中使用空格。。。使用 代码:


大多数正则表达式实现中的许多说明符(包括Python的说明符)都会贪婪地执行操作——也就是说,它们尽可能多地匹配输入字符串。因此,正则表达式中的第一个.*与所有输入字符串匹配,但最后一组括号除外,即第一个.*将尽可能地消耗掉所有内容,同时仍为整个正则表达式留出足够的空间,以便成功匹配。进入这组括号后,您首先会有另一个。*,它同样匹配它所能匹配的所有内容,并且仍然让正则表达式的其余部分有足够的内容进行成功匹配-因此,除了最后一个破折号之外,最后一对括号中的所有破折号。因此,替换只在最后一组括号中的最后一个破折号周围插入空格,因为您的正则表达式只有一个不重叠的匹配项:它匹配整个输入字符串,只是正则表达式中在括号之间挑出破折号的部分只包括最后一个这样的破折号

要解决这个问题,您可能需要重新评估部分方法,因为re.sub将替代非重叠匹配,而且我怀疑构建一个可以匹配给定括号对之间任意数量破折号的正则表达式是否可行,使用相应的替换,在每个破折号周围放置空格,并且仍然使这些匹配与能够捕获任意数量组的正则表达式系统不重叠,但据我所知,Python的实现仅捕获给定匹配中任何可重复组*或+等的最后捕获组。使用正则表达式检查破折号周围的括号需要将它们包括在匹配中,这意味着匹配并替换括号之间单个破折号的正则表达式将具有重叠匹配,其中同一对括号中有多个破折号

增量方法虽然在实现上有点复杂,但可能是获得所需行为的更好方法。您可以使用re.split和适当的正则表达式将字符串拆分为带括号的部分和插入的非插入部分,然后使用更简单的正则表达式(如r'[^-]*-[^-]*'匹配任何破折号*)仅对插入部分执行正则表达式替换,然后用新插入部分重新组装完整序列。这有效地将“单独捕获括号内的所有破折号”问题(单个正则表达式很难正确捕获)分解为“查找括号部分”和“单独捕获破折号”两个问题,这两个问题更容易解决

*请注意,此正则表达式建议使用字符类[^-],表示“任何非-”字符。这避免了当前正则表达式显示的问题。*在匹配的字符中包含破折号,并吃掉除最后一个字符以外的所有字符,因为当下一个字符是-时,[^-]*将被迫停止匹配。但是,在当前正则表达式中简单地用[^-]*替换。*并不能解决问题,因为对于重叠的匹配项,re.sub不会替换,就像在这种情况下相同括号中的多个破折号一样。

尝试一种更简单的方法:

产出:

Mr. Queen (The - American - Detective, EQ), Mr. Holmes (The - British - Detective)
以下是工作说明:

\w基本上与[a-zA-Z0-9_]相同,即它匹配 小写、大写、数字或下划线

\-匹配-


所以,这个正则表达式匹配任何形式的字符串something-any-otherthing,并用something-any-otherthing替换它。对不起,您只是想添加额外的空格吗?你能澄清你的问题并给出更多的例子吗?@AlanSTACK我正试图通过使用re.sub在括号内分隔破折号来增加额外的空间。你遇到了什么问题?您的示例显示它工作得非常好。@AlanSTACK;结果是“Queen先生是美国侦探,EQ先生,Holmes先生是英国侦探,只添加了最后一个括号和最后一个破折号,而我正在尝试为括号内出现的所有破折号添加空间我现在正在路上,但是
t这是一个问题,因为您的正则表达式默认匹配尽可能多的字符,例如greedysorry;但这段代码只有在有破折号时才有效?在一般情况下,在处理语言过程中的句子时,我们不能做出这样的假设。而且,它一开始似乎不起作用bracket@ElleryL不,你错了。不管是否有破折号,这都是有效的。对不起,我的意思是它似乎只适用于出现两个破折号的情况,但是如果有两个以上的破折号呢?我假设您需要解决类似a-b-c的情况。也许,我应该概括一下。
import re
s = "Mr. Queen (The-American-Detective, EQ), Mr. Holmes (The-British-Detective) "
s = re.sub(r'(\w+)(\-)(\w+)(\-)(\w+)', '\\1 \\2 \\3 \\4 \\5', s)
print(s)
Mr. Queen (The - American - Detective, EQ), Mr. Holmes (The - British - Detective)