python中特定字符串的正则表达式问题

时间:2019-03-08 15:34:23

标签: python regex

我在python中遇到了正则表达式问题。我有字符串:

'Aaa Bbb', 'AaaBbbCcc' ,'OneTwost.Three'

我想得到:

`'Aaa Bbb', 'Aaa Bbb Ccc'` 
and 'One Two st.Three' or 'One Two st. Three'

通常,我需要在每个大写字母之前插入空格(如果在大写字母之前是空格以外的另一个符号)并且在字符串中存在。 (点)比插入空间2靠后。

我是re库的初学者。我尝试根据有关正则表达式的一些主题来执行此操作,但是我不知道这一点。有人知道怎么做吗?

2 个答案:

答案 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'

第一个解释:

  • 根据您的报价建议将其制成字符串
  • 在这种情况下,使用 re.sub 和raw_string(r)选项可以打印动态/更改/变量捕获功能,并返回已编辑的字符串
  • 使用第一个"(",我将其设置为捕获后续查询中的所有内容
  • 使用"(?<![\',\s])"的意思是要确保我尝试捕获的内容后面没有“'”或“空白”
  • "[A-Z]+"放置在原位置,我是说捕获任何大写字母(但请注意:这也将匹配ABC,SDZ,FFRD,ZXF等,但不会捕获任何小写字母字母或其他符号
  • "|"告诉引擎,“或”捕获下一个查询
  • 对于"[\S]{2}\.",我是说如果您发现任意2个“非空白字符”后跟一个“。”,则表示捕获。
  • 最后一个")"结束捕获组指令
  • 使用第二个参数“ r'\ 1'”表示要捕获的第一个组(在这种情况下,我仍然只有一个捕获组)并在其前面放置一个空格

编辑:以下对2可以在string_1上起作用的简要说明

  • 我发誓,re.sub的环顾四周行为举止很古怪。在下面给出您的评论。通过每个(?<!YOUR_IGNORED_CHARACTER),我告诉re.sub本质上不能捕获大写字母前面是否有指定字符。 (?<!^)表示如果捕获组出现在行的开头,则不捕获。

  • 另外请注意,在此示例的字符串中,我从您提供的字符串中删除了'