我在python中遇到了正则表达式问题。我有字符串:
'Aaa Bbb', 'AaaBbbCcc' ,'OneTwost.Three'
我想得到:
`'Aaa Bbb', 'Aaa Bbb Ccc'`
and 'One Two st.Three' or 'One Two st. Three'
通常,我需要在每个大写字母之前插入空格(如果在大写字母之前是空格以外的另一个符号)并且在字符串中存在。 (点)比插入空间2靠后。
我是re库的初学者。我尝试根据有关正则表达式的一些主题来执行此操作,但是我不知道这一点。有人知道怎么做吗?
答案 0 :(得分:1)
您可以使用
(?<=\S)(?=[A-Z])|(.{2}\.)
哪些需要替换为功能,请参见a demo on regex101.com。
Python
中,这可能是
import re
data = """
Aaa Bbb
AaaBbbCcc
OneTwost.Three
"""
rx = re.compile(r'(?<=\S)(?=[A-Z])|(.{2}\.)')
def replacer(match):
if match.group(1):
return " {} ".format(match.group(1))
return r' '
data = rx.sub(replacer, data)
print(data)
哪个产量
Aaa Bbb
Aaa Bbb Ccc
One Two st. Three
答案 1 :(得分:1)
根据您所说的内容和您所说的“我有字符串”这一事实:
我有一个字符串
'Aaa Bbb','AaaBbbCcc','OneTwost.Three'
这些应该做。
输入:
>>> import re
>>> string = """'Aaa Bbb', 'AaaBbbCcc' ,'OneTwost.Three'"""
输出:
>>> re.sub(r'((?<![\',\s])[A-Z]+|[\S]{2}\.)', r' \1', string)
"'Aaa Bbb', 'Aaa Bbb Ccc' ,'One Two st. Three'"
。
修改
输入(作用于string
和删除了string_1
的新变量'
)
>>> import re
>>> string = """'Aaa Bbb', 'AaaBbbCcc' ,'OneTwost.Three'"""
>>> string_1 = """Aaa Bbb, AaaBbbCcc ,OneTwost.Three"""
输出
>>> re.sub(r'(?<!^)(?<!,)(?<!\s)(?<!\')([A-Z]+|[\S]{2}\.)', r' \1', string)
"'Aaa Bbb', 'Aaa Bbb Ccc' ,'One Two st. Three'"
>>> re.sub(r'(?:(?<!^)(?<!,)(?<!\s)(?<!\'))([A-Z]+|[\S]{2}\.)', r' \1',
string)
"'Aaa Bbb', 'Aaa Bbb Ccc' ,'One Two st. Three'"
>>> re.sub(r'(?<!^)(?<!,)(?<!\s)(?<!\')([A-Z]+|[\S]{2}\.)', r' \1', string_1)
'Aaa Bbb, Aaa Bbb Ccc ,One Two st. Three'
>>> re.sub(r'(?:(?<!^)(?<!,)(?<!\s)(?<!\'))([A-Z]+|[\S]{2}\.)', r' \1', string_1)
'Aaa Bbb, Aaa Bbb Ccc ,One Two st. Three'
。
第一个解释:
"("
,我将其设置为捕获后续查询中的所有内容"(?<![\',\s])"
的意思是要确保我尝试捕获的内容后面没有“'”或“空白” "[A-Z]+"
放置在原位置,我是说捕获任何大写字母(但请注意:这也将匹配ABC,SDZ,FFRD,ZXF等,但不会捕获任何小写字母字母或其他符号)"|"
告诉引擎,“或”捕获下一个查询"[\S]{2}\."
,我是说如果您发现任意2个“非空白字符”后跟一个“。”,则表示捕获。")"
结束捕获组指令编辑:以下对2可以在string_1上起作用的简要说明
我发誓,re.sub
的环顾四周行为举止很古怪。在下面给出您的评论。通过每个(?<!YOUR_IGNORED_CHARACTER)
,我告诉re.sub本质上不能捕获大写字母前面是否有指定字符。 (?<!^)
表示如果捕获组出现在行的开头,则不捕获。
另外请注意,在此示例的字符串中,我从您提供的字符串中删除了'
。