REGEX:删除一个或两个字母的字符串之间的空格

问题描述 投票:1回答:3

请考虑下表的第一栏中显示的以下原始字符串:

Original String                  Parsed String                   Desired String
'W. & J. JOHNSON LMT.COM'       #W    J  JOHNSON LIMITED        #WJ JOHNSON LIMITED
'NORTH ROOF & WORKS CO. LTD.'   #NORTH ROOF   WORKS CO  LTD     #NORTH ROOF WORKS CO LTD
'DAVID DOE & CO., LIMITED'      #DAVID DOE   CO   LIMITED       #DAVID DOE CO LIMITED
'GEORGE TV & APPLIANCE LTD.'    #GEORGE TV   APPLIANCE LTD      #GEORGE TV APPLIANCE LTD 
'LOVE BROS. & OTHERS LTD.'      #LOVE BROS    OTHERS LTD        #LOVE BROS OTHERS LTD
'A. B. & MICHAEL CLEAN CO. LTD.'#A  B    MICHAEL CLEAN CO  LTD  #AB MICHAEL CLEAN CO LTD
'C.M. & B.B. CLEANER INC.'      #C M    B B  CLEANER INC        #CMBB CLEANER INC

我已按如下所示删除标点符号:

def transform(word):
    word = re.sub(r'(?<=[A-Za-z])\'(?=[A-Za-z])[A-Z]|[^\w\s]|(.com|COM)',' ',word)

但是,我没有最后一点。删除标点符号后,我最终得到了很多空格。我如何拥有一个将首字母放在一起并保留单个空格的正则表达式(没有首字母)的正则表达式?

替换提到的字符以获得所需的字符串是一种不好的方法吗?

感谢您允许我继续学习:)

python regex etl regex-lookarounds
3个回答
2
投票

我认为部分执行此操作比较简单。首先,删除.comspace&以外的其他标点符号。然后,删除仅用一个字母包围的space&。最后,用单个空格替换space&的所有剩余序列:

import re
strings = ['W. & J. JOHNSON LMT.COM',
'NORTH ROOF & WORKS CO. LTD.',
'DAVID DOE & CO., LIMITED',
'GEORGE TV & APPLIANCE LTD.',
'LOVE BROS. & OTHERS LTD.',
'A. B. & MICHAEL CLEAN CO. LTD.',
'C.M. & B.B. CLEANER INC.'
]

for s in strings:
    s = re.sub(r'\.COM|[^a-zA-Z& ]+', '', s, 0, re.IGNORECASE)
    s = re.sub(r'(?<=\b\w)\s*[ &]\s*(?=\w\b)', '', s)
    s = re.sub(r'\s*[& ]\s*', ' ', s)
    print s

输出

WJ JOHNSON LMT
NORTH ROOF WORKS CO LTD
DAVID DOE CO LIMITED
GEORGE TV APPLIANCE LTD
LOVE BROS OTHERS LTD
AB MICHAEL CLEAN CO LTD
CM BB CLEANER INC

Demo on rextester

更新

这是在编辑问题之前写的,以更改最后一个数据的所需结果。进行编辑后,以上代码可以简化为

for s in strings:
     s = re.sub(r'\.COM|[^a-zA-Z ]+|\s(?=&)|(?<!\w\w)\s+(?!\w\w)', '', s, 0, re.IGNORECASE)
     print s

Demo on rextester


1
投票

这里是最简单的一种正则表达式模式:

\.COM|(?<![A-Z]{2}) (?![A-Z]{2})|[.&,]| (?>)&

基本上,它删除符合3个条件的字符:

  1. 文字“ .COM”
  2. 没有两个大写字母的空格
  3. 点,&符号和逗号,无论它们出现在何处
  4. 后跟&的空格

演示:https://regex101.com/r/EMHxq9/2


1
投票

仅在正则表达式中执行此操作就不会很漂亮,也不是最佳解决方案,但是,这确实是!您最好采用多步骤方法。我所做的是确定所有可能的情况,并选择一种解决方案,其中没有替换字符串,因为您并不总是用空格替换字符。


规则

  1. 非“堆叠”缩写
    • 这些是类似A. B.W. & J.的位置,但不是C.M. & B.B.
    • 我已经将它们标识为缩写部分(例如A.)在前后的位置,但后面没有另一个字母字符
  2. 前面的空格
    • 这些位置在您的文本中不存在,但是如果空格在非字母字符之前,但后面没有空格(例如,在行尾),则可以]
    • 在这种情况下,我们匹配第一个空格之后的字符
  3. 开始空间
    • 这些是&J.中的点的位置>
    • 在这些示例中,我们在最后一个空格之前匹配字符
  4. 没有空格
    • 这些是类似'LOVE的位置(该字符串中的撇号)
  5. 我们只匹配非字母-非空白字符

  6. 正则表达式

    完成此操作的多合一正则表达式如下:

See regex in use here

(?<=\b[a-z])[^a-z]+(?=[a-z]\b(?![^a-z][a-z]))|(?<= ) *(?:\.com\b|[^a-z\s]+) *| *(?:\.com\b|[^a-z\s]+) *(?= )|(?<! )(?:\.com\b|[^a-z\s]+)(?! )

工作原理如下(分解为每个交替):

  • (?<=\b[a-z])[^a-z]+(?=[a-z]\b(?![^a-z][a-z]))匹配A.B.之间的非字母字符,但不匹配A.B.B
    • (?<=\b[a-z])向后保证正向,确保后面是一个字母字符,并在其左边声明单词边界位置
    • [[^a-z]+匹配任何一个非字母字符一次或多次
    • (?=[a-z]\b(?![^a-z][a-z]))正向前瞻确保存在以下条件
      • [[a-z]\b匹配任何字母字符并在其右边声明单词边界位置
      • (?![^a-z][a-z])否定前瞻,确保后面不是非字母字符,后跟字母字符
  • (?<= ) *(?:\.com\b|[^a-z\s]+) *确保前面有一个空格,然后匹配任何空格,.com或任何非单词非空白字符一次或多次,然后匹配任何空格
    • (?<= )向后看以确保前面有空格
  • [*匹配任意数量的空格
  • [(?:\.com\b|[^a-z\s]+)匹配.com并确保后面跟随一个非单词字符,或一次或多次匹配任何一个非单词非空白字符
  • [*匹配任意数量的空格
  • *(?:\.com\b|[^a-z\s]+) *(?= )匹配任何空格,.com或任何非单词非空白字符一次或多次,然后匹配任何空格,然后确保后面跟随一个空格
    • 与上一个相同,但开始时没有正面的期待,但结束时有正面的期待
  • (?<! )(?:\.com\b|[^a-z\s]+)(?! )匹配.com或任何非alpha-非空白字符一次或多次,以确保没有空格
    • 与前两个选项相同,但使用负向后看和负向前看

  • 代码

    See code in use here

    import re
    
    strings = [
        "'W. & J. JOHNSON LMT.COM'",
        "'NORTH ROOF & WORKS CO. LTD.'",
        "'DAVID DOE & CO., LIMITED'",
        "'GEORGE TV & APPLIANCE LTD.'",
        "'LOVE BROS. & OTHERS LTD.'",
        "'A. B. & MICHAEL CLEAN CO. LTD.'",
        "'C.M. & B.B. CLEANER INC.'"
    ]
    
    r = re.compile(r'(?<=\b[a-z])[^a-z]+(?=[a-z]\b(?![^a-z][a-z]))|(?<= ) *(?:\.com\b|[^a-z\s]+) *| *(?:\.com\b|[^a-z\s]+) *(?= )|(?<! )(?:\.com\b|[^a-z\s]+)(?! )', re.IGNORECASE)
    
    def transform(word):
        return re.sub(r, '', word)
    
    for s in strings:
        print(transform(s))
    

    输出:

    WJ JOHNSON LMT
    NORTH ROOF WORKS CO LTD
    DAVID DOE CO LIMITED
    GEORGE TV APPLIANCE LTD
    LOVE BROS OTHERS LTD
    AB MICHAEL CLEAN CO LTD
    CM BB CLEANER INC
    
    © www.soinside.com 2019 - 2024. All rights reserved.