用Python替换或交换字符串中的子字符串

2024-09-25 10:26:03 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我在ASCII文件中有一行,格式如下:

{text1} {stringA} {text2} {stringB} {text3}

其中{stringA}和{}是感兴趣的子字符串。我们分别称它们为“A”和“B”。字符串{text1}{text2}{text3}是不包含A或B的任何长度的字符串(可能为空)

我想在Python中做的只是交换A和B,这样行就可以从

{text1} {stringA} {text2} {stringB} {text3}

{text1} {stringB} {text2} {stringA} {text3}

我很感激你的帮助。在这个问题上,让Python更好地帮助我学习正则表达式。在

注意,{text1}{text2},和{}是未知字符串。

我们确切地知道子串A和B。我们知道A在B之前。然而,我们不知道他们之前/之间/之后有什么(如果有的话)。在

示例(A=John,B=Tim):

(1)这:

“我叫约翰把包给蒂姆。”

改为:

“我叫蒂姆把包给约翰。”

(2)这:

“约翰向蒂姆问好。”

改为:

“蒂姆向约翰问好。”

(3)这:

“约翰!“h9aghagTim”

改为:

“蒂姆!“h9aghagJohn”


Tags: 文件字符串示例格式asciijohn感兴趣tim
2条回答

要采用的方法是使用捕获组,以便以后可以引用它们

result = re.sub(r"(\{text1\}) (\{stringA\}) (\{text2\}) (\{stringB\}) (\{text3\})", r"\1 \4 \3 \2 \5", subject)

捕获组由括号()标识,在python中通过\x引用它们,其中x是捕获组的编号

更新1

您的示例使您更清楚地了解您想要什么以及当前如何看待regex。正则表达式匹配字符的模式。你想交换名字(Tom,Tim,…),所以我们需要想出一个模式来匹配一个只有完全枚举才能匹配的名字。在我的语言中有成千上万的名字,其中一些还用来指物体而不是人。为了做出这种区分,你必须考虑正则表达式不能考虑的上下文。让我知道这是否有意义,因为如果你想更进一步,这是很重要的。在

更新2

我怀疑你的问题是出于好奇,不是为了解决现实生活中的问题。但如果我们继续下去,这会让你走得更远,但这并不完美,也不可能

正则表达式

^{pr2}$

替换为

\1\4\3\2

在python中

result = re.sub(r"(?sm)(.*)\b(John|Tim|Jo)\b(.*)\b(John|Tim|Jo)\b", r"\1\4\3\2", subject)

请注意regex中的\b,它声明匹配应该发生在单词边界处。这会阻止像约翰多这样的比赛。在

还要注意,上面的正则表达式对于这个句子来说是失败的

Tim bought some top level domains of Jordan that end with Jo from John

>>> import re
>>> text = '{text1} {stringA} {text2} {stringB} {text3}'
>>> re.sub(r'(stringA)(.*)(stringB)', r'\3\2\1', text)
'{text1} {stringB} {text2} {stringA} {text3}'

stringA和{}替换为您感兴趣的子字符串,请注意,您可能希望^{}它们,以防子字符串在regex中具有特殊含义的字符。在

测试用例:

^{pr2}$

相关问题 更多 >