【问题标题】:Remove string after slash with condition带条件的斜线后删除字符串
【发布时间】:2020-03-13 18:43:30
【问题描述】:

我想删除短语中的第二部分,只要它超过 3 个字符(字母和数字),如果字符为 3 个或更少,则添加空格。

在以下测试集中:

CENTRAL CARE HOSPITAL/HOPITAL CENTRALE DE SOINS
ABC/DEF
FOUNDATION INSTITUTION/FUNDATION DEL INSTITUTO
HAPPY SPRING BREAK 20/20

结果应该是

CENTRAL CARE HOSPITAL
ABC DEF
FOUNDATION INSTITUTION
HAPPY SPRING BREAK 20 20

我的第一次尝试是这样的:

([^\/]+$)

但是,斜杠后面的所有字符串都没有了,因为它没有任何限制。我需要包含一个否定的前瞻性说明,当斜杠后面的字符超过 3 个时,我需要删除字符串:

text= re.sub(r'(^[^\/]+)(?:[\/])(?![A-Z]{3})',
             r'\1 ',
             text,
             0,
             re.IGNORECASE)

我得到以下不正确的信息:

CENTRAL CARE HOSPITAL/HOPITAL CENTRALE DE SOINS 
ABC DEF
FOUNDATION INSTITUTION/FUNDATION DEL INSTITUTO 
HAPPY SPRING BREAK 20 20

如何去掉前面的斜线和字符串?

谢谢

【问题讨论】:

  • 您需要首先完整地陈述您的问题,而不是先说出您尝试过的内容,然后再充实问题。你的第一句话很好,但它是对问题的不完整描述。此时,您需要将示例与所需结果一起提供,例如,“例如,给定以下测试集......我希望返回以下内容:......然后继续提供您的代码和您获得的错误结果。请注意,在返回值中包含“(正确)”会造成混淆。
  • 正如@CarySwoveland 指出的,输入字符串和预期输出字符串的清晰演示是必须的。
  • 抱歉,我更新了问题以便更容易理解。
  • 好多了!请注意,您需要在每个问题中采用这种方法。用例子前面的文字表述的问题越完整越好。目标是使问题的陈述如此完整和明确,以至于示例不是必需的(尽管通常是可取的)。
  • 我从您的输出中看到了另一个要求。斜线转换为空格字符。为什么?

标签: python regex regex-lookarounds regex-negation regex-group


【解决方案1】:

您可以使用 2 个捕获组来捕获 / 之前和之后的 1-3 个字符 A-Z 或数字,并在替换中使用这些组,其间有空格。

使用交替匹配正斜杠,后跟要删除的其余字符串。

\b([A-Z0-9]{1,3})/([A-Z0-9]{1,3})\b|/.*

在替换中使用 2 个捕获组

r"\1 \2"

说明

  • \b字边界
  • ([A-Z0-9]{1,3})捕获第1组,匹配1-3次A-Z或一个数字
  • / 字面匹配
  • ([A-Z0-9]{1,3})捕获第2组,匹配1-3次A-Z或数字
  • \b字边界
  • |或者
  • /.* 匹配 / 和 0+ 次除换行符以外的任何字符

Regex demo | Python demo

示例代码

import re

regex = r"\b([A-Z0-9]{1,3})/([A-Z0-9]{1,3})\b|/.*"

text = ("CENTRAL CARE HOSPITAL/HOPITAL CENTRALE DE SOINS\n"
    "ABC/DEF\n"
    "FOUNDATION INSTITUTION/FUNDATION DEL INSTITUTO\n"
    "HAPPY SPRING BREAK 20/20")

result = re.sub(regex, r"\1 \2", text)
print (result)

输出

CENTRAL CARE HOSPITAL 
ABC DEF
FOUNDATION INSTITUTION 
HAPPY SPRING BREAK 20 20

【讨论】:

    【解决方案2】:

    你必须使用正则表达式吗?这样做有什么问题?

    tests = [
        "CENTRAL CARE HOSPITAL/HOPITAL CENTRALE DE SOINS", 
        "ABC/DEF", 
        "FOUNDATION INSTITUTION/FUNDATION DEL INSTITUTO", 
        "HAPPY SPRING BREAK 20/20"
    ]
    
    for test in tests:
        separate = test.split("/", 1)
        print(separate[0] if len(separate[1])>3 else test)
    

    【讨论】:

      【解决方案3】:

      试试这个正则表达式模式:

      text= ["CENTRAL CARE HOSPITAL/HOPITAL CENTRALE DE SOINS ",
             "ABC/DEF",
             "FOUNDATION INSTITUTION/FUNDATION DEL INSTITUTO",
             "HAPPY SPRING BREAK 20/20"]
      
      for element in text:
          str_res = re.sub(r'(?:[\/])([A-Z0-9]{0,3}\b)|[^\/]*$',
                           r' \1',
                           element,
                           0,
                           re.IGNORECASE)
          print(str_res)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多