为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕桂英4014372 2021-11-30 16:38:15
我在 python 中遇到正则表达式问题。我有字符串:'Aaa Bbb', 'AaaBbbCcc' ,'OneTwost.Three'我想得到:`'Aaa Bbb', 'Aaa Bbb Ccc'`  and 'One Two st.Three' or 'One Two st. Three'通常,我需要在每个大写字母之前插入空格(如果大写字母之前是另一个符号而不是空格)并且如果在字符串中存在。(点)比插入空格 2 位置靠后。我是 re 图书馆的初学者。我尝试根据堆栈中关于正则表达式的一些主题来执行此操作,但我不明白这一点。任何人都知道如何做到这一点?
查看完整描述

2 回答

?
jeck猫

TA贡献1909条经验 获得超7个赞

根据您所说的您想要的内容以及您所说的“我有字符串”这一事实:


我有字符串


'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'"

.


编辑


输入(作用于删除's 的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'" 我是说打印你捕获的第一组(在这种情况下我只有一个捕获组)并在它前面放置一个空格

编辑:对可以作用于 string_1 的以下 2 的轻微解释

  • 我发誓,re.sub环顾四周的行为只是不稳定。鉴于您在下面的评论。通过每个(?<!YOUR_IGNORED_CHARACTER),我告诉 re.sub 如果大写字母前面是指定字符,则基本上不捕获。(?<!^)但是,如果捕获组出现在行的开头,则表示不捕获。

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


查看完整回答
反对 回复 2021-11-30
?
茅侃侃

TA贡献1842条经验 获得超21个赞

你可以用


(?<=\S)(?=[A-Z])|(.{2}\.)

需要用函数替换,参见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


查看完整回答
反对 回复 2021-11-30
  • 2 回答
  • 0 关注
  • 180 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信