Python中的字符串操作

Python中的字符串操作,python,Python,我有一个由6个字母随机生成的字符串,例如: A' B F2 E' B2 A2 C' D2 C D' E2 F 有些字母加了“”,有些字母加了数字“2”。我想要的是在每个单独的字母中添加字母“x” 所以看起来是这样的: A' Bx F2 E' B2 A2 C' D2 Cx D' E2 Fx 诀窍在于,它只会将“x”添加到那些独立的字母中。否,Bx->Bx2 有什么想法吗?使用split()将字符串转换为列表 使用split()将字符串转换为列表 使用正则表达式 import re newstr

我有一个由6个字母随机生成的字符串,例如:

A' B F2 E' B2 A2 C' D2 C D' E2 F
有些字母加了“”,有些字母加了数字“2”。我想要的是在每个单独的字母中添加字母“x”

所以看起来是这样的:

A' Bx F2 E' B2 A2 C' D2 Cx D' E2 Fx
诀窍在于,它只会将“x”添加到那些独立的字母中。否,Bx->Bx2


有什么想法吗?

使用split()将字符串转换为列表


使用split()将字符串转换为列表


使用正则表达式

import re
newstring = re.sub(r"\b(\w)(?![2'])", r'\1x', oldstring)
应该没问题。如果您对
re
s过敏

news = ' '.join(x + 'x' if len(x)==1 else x for x in olds.split())

是一种表达类似转换的简洁方式(如果在将“x”附加到项目之前,长度1是唯一需要检查的内容)。

使用正则表达式

import re
newstring = re.sub(r"\b(\w)(?![2'])", r'\1x', oldstring)
应该没问题。如果您对
re
s过敏

news = ' '.join(x + 'x' if len(x)==1 else x for x in olds.split())

是一种表达类似转换的简洁方式(如果在将“x”附加到项目之前,长度1确实是唯一需要检查的内容)。

拆分-合并版本:

' '.join(n+'x' if len(n)==1 else n for n in inputstr.split(' '))
正则表达式版本:

>>> inputstr = "A' F B2 C"
>>> re.sub(r'([A-Z])(?=\s|$)', r'\1x', inputstr)
"A' Fx B2 Cx"
本质上,找到任何不后跟空格或字符串结尾的大写字母,并将其替换为后跟
x


我用它做了一些测试;前者(列表理解)似乎比后者略快(平均快15-20%)。无论需要进行多少次替换(10倍长的字符串仍具有与原始字符串相同的处理时间比率),这似乎都不会改变。

拆分连接版本:

' '.join(n+'x' if len(n)==1 else n for n in inputstr.split(' '))
正则表达式版本:

>>> inputstr = "A' F B2 C"
>>> re.sub(r'([A-Z])(?=\s|$)', r'\1x', inputstr)
"A' Fx B2 Cx"
本质上,找到任何不后跟空格或字符串结尾的大写字母,并将其替换为后跟
x

我用它做了一些测试;前者(列表理解)似乎比后者略快(平均快15-20%)。无论需要进行多少次替换(长度为原来的10倍的字符串仍然具有与原始字符串相同的处理时间比率),这似乎都不会改变。

丑陋的还是Pythonic的

items = "A' B F2 E' B2 A2 C' D2 C D' E2 F".split()

itemsx = ((a+'x' if len(a)==1 else a) for a in items)
out = ' '.join(itemsx)
丑还是蟒蛇

items = "A' B F2 E' B2 A2 C' D2 C D' E2 F".split()

itemsx = ((a+'x' if len(a)==1 else a) for a in items)
out = ' '.join(itemsx)

这实际上失败了,因为
A'
被认为在
A
之间有一个单词边框。(另外,您忘记了在
\w
周围有一个捕获组)更新版本仍需要调整-捕获组应仅在
\w
周围,而不是以下字符。另外,由于它试图在
\w
之后匹配一个字符,因此它无法在字符串末尾的单个字符上工作。最后,由于
re.sub
的行为是替换整个匹配部分,而不仅仅是捕获组,这将(我确信是无意中)删除它所替换的字符之后的空格。@Dav,优秀的分析--所以我再次编辑,切换到负面展望,这应该会解决所有问题+1到你的每一个点评!您还可以包含一个肯定的lookback并完全删除记住的组:
re.sub(r)(?这实际上失败了,因为
a'
被认为在
a
'
之间有一个单词边框(另外,您忘记了
\w
周围有一个捕获组)更新后的版本仍然需要调整-捕获组应仅位于
\w
附近,而不是以下字符。此外,由于它试图匹配
\w
之后的字符,因此无法在字符串末尾的单个字符上工作。最后,因为
re.sub
的行为是替换整个匹配的端口ion,不仅仅是捕获组,这将(我确信是无意中)去掉它替换的字符后的空格。@Dav,非常好的分析--因此我再次编辑以切换到负面前瞻,这应该会解决所有问题。+1到您的每个即时评论!您还可以包括正面前瞻并完全删除记住的组:
re.sub(r)(?