Python正则表达式如何在字母和数字之间插入连字符;并删除两个字母之间的连字符

标签 python regex hyphenation

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

  • 如果两个字母之间有连字符 -,我们必须将其删除:
    • 示例 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)

不幸的是,它不起作用。我不知道该怎么做。

最佳答案

您可以使用 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

关于Python正则表达式如何在字母和数字之间插入连字符;并删除两个字母之间的连字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61605661/

相关文章:

regex - 带前缀的有效十进制或十六进制的正则表达式

regex - perl6语法,不确定示例中的某些语法

latex - 如何防止LaTeX对包含破折号的单词进行连字?

nlp - 检测单词中的音节

iphone - 断字库不适用于 iOS 5

python - 过滤前将函数应用于列

python - 无法在django中将Sqlite迁移到mysql

python - webapp2 CRUD 路由返回 405

python - 如何确保共享变量是线程安全的?

正则表达式允许 ascii 代码 128-165?