如何使用re为大型列表中的每个项目查找连续的空格分隔的单个字符

时间:2017-02-06 16:19:05

标签: python python-2.7 python-3.x

假设我有以下清单
 shuffle()
并希望将其转换为
['Y M C A','cambridge m a','d m v office','t mobile']

用于检测所有连续的单个字符,后跟不同长度的单个空格(大于2)。例如,项['YMCA','cambridge ma','dmv office','t mobile'],我们应该检测到'd m v office'并将其转换为**'d m v'**,但会保留**'dmv'**完整(只有一个字符)。

我知道我可以遍历列表,按空格分割每个项目并查找单个字符项但听起来效率不高。是否可以使用正则表达式和模块重新进行?连续的模式可以是任何长度,大于1。

3 个答案:

答案 0 :(得分:1)

以下内容应该有效:

import re

def trim_match_spaces(matchObj):
    return ''.join(matchObj.group(0).split())

templist = ['Y M C A', 'cambridge m a', 'd m v office', 't mobile', 'cambridge m a is far from the sun']

for index, word in enumerate(templist):
    templist[index] = re.sub(r'(\b(\w\s)+\w\b)', trim_match_spaces, word)

print templist

打印

['YMCA', 'cambridge ma', 'dmv office', 't mobile', 'cambridge ma is far from the sun']

答案 1 :(得分:0)

使用正则表达式sub对我有用:

text = 'd m v office'
out = re.sub(r'(.) (.)(?:\s+|$)',r'\1\2',text)
print(out) #<-- prints 'dmv office'

第一个参数是要匹配的模式,它有3个捕获组,前两个是匹配由空格分隔的单个字符的(.) (.)(?:\s+|$)匹配字符串的空格或结尾。第二个参数表示用前两个捕获组替换命中,第三个参数是文本输入。

答案 2 :(得分:0)

以下是您可以使用的正则表达式的示例:

\b(\w(?:[\b ]\w)+)\b

您可以在此处查看regex101示例: https://regex101.com/r/WCGE6q/1