Python regex如何将字符串转换为特定模式

问题描述 投票:0回答:2

我正在尝试使用正则表达式在字符串中执行以下操作:

  • 如果两个字母之间有连字符-,我们必须将其删除:
    • 示例 A-BA应该为ABA;并且A-B-BAB应该为ABBAB
  • 如果字母和数字彼此相邻,那么我们必须在它们之间插入连字符-符号:
    • 示例 9AHYA7应该为9-AHYA-7;并且977AB99T5应该为977-AB-99-T-5

这些模式只是简单的示例。这样的字符串可能会更复杂:

  • HS98743YVJUHGF78BF8HH3JHFC83438VUN5498FCNG
  • 7267-VHSBVH8737HHC8C-HYHFWYFHH-7Y84743YR8437G

在以上字符串中,必须包含相同的原理。

我尝试了以下代码将8T转换为8-T

    re.sub(r'\dab-d', '\d-ab-d', s)

很遗憾,它不起作用。我不确定该怎么做。

python regex numbers character hyphen
2个回答
1
投票

您可能会使用2个具有环视效果的捕获组,在替换中使用lambda来检查匹配的组。

如果第1组匹配,请删除最后一个字符。如果第2组匹配,请附加一个连字符。

([A-Z]-(?=[A-Z]))|([A-Z](?=[0-9])|[0-9](?=[A-Z]))

说明

  • (捕获组1
    • [[A-Z]-(?=[A-Z])匹配A-Z和-并断言右边是A-Z
  • )封闭组
  • |
  • (捕获第2组
    • [[A-Z](?=[0-9])匹配A-Z并断言右边的是数字
    • |
    • [[0-9](?=[A-Z])匹配0-9并断言右边的是A-Z
  • )封闭组

Regex demo | Python demo

示例代码

import re

pattern = r"([A-Z]-(?=[A-Z]))|([A-Z](?=[0-9])|[0-9](?=[A-Z]))"
strings = [
    "A-BA",
    "A-B-BAB",
    "9AHYA7",
    "977AB99T5",
    "HS98743YVJUHGF78BF8HH3JHFC83438VUN5498FCNG",
    "7267-VHSBVH8737HHC8C-HYHFWYFHH-7Y84743YR8437G"
]

for str in strings:
    result = re.sub(
        pattern,
        lambda x: x.group(1)[:-1] if x.group(1) else x.group(2) + "-",
        str
    )
    print(result)

输出

ABA
ABBAB
9-AHYA-7
977-AB-99-T-5
HS-98743-YVJUHGF-78-BF-8-HH-3-JHFC-83438-VUN-5498-FCNG
7267-VHSBVH-8737-HHC-8-CHYHFWYFHH-7-Y-84743-YR-8437-G

1
投票

如果要使用re.sub,那么这是使用捕获组的一种方法:

inp = "8T-ENI-A2"
output = re.sub(r'^(.)(.)-([^-]+)-(.)(.)$', '\\1-\\2\\3\\4-\\5', inp)
print(output)

此打印:

8-TENIA-2
© www.soinside.com 2019 - 2024. All rights reserved.