Python 正则表达式如何在字母表和数字之间插入连字符;并删除两个字母之间的连字符
Python regex how to insert hyphen symbol between an alphabet and a digit; and also remove hyphen in between two alphabets
我正在尝试使用正则表达式在字符串中执行以下操作:
- 如果两个字母之间有连字符
-
,我们必须将其删除:
- 例子
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)
不幸的是,它不起作用。我不知道该怎么做。
如果您想使用 re.sub
,那么这里有一种方法,使用捕获组:
inp = "8T-ENI-A2"
output = re.sub(r'^(.)(.)-([^-]+)-(.)(.)$', '\1-\2\3\4-\5', inp)
print(output)
这会打印:
8-TENIA-2
您可以使用 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
)
关闭群组
示例代码
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
我正在尝试使用正则表达式在字符串中执行以下操作:
- 如果两个字母之间有连字符
-
,我们必须将其删除:- 例子
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)
不幸的是,它不起作用。我不知道该怎么做。
如果您想使用 re.sub
,那么这里有一种方法,使用捕获组:
inp = "8T-ENI-A2"
output = re.sub(r'^(.)(.)-([^-]+)-(.)(.)$', '\1-\2\3\4-\5', inp)
print(output)
这会打印:
8-TENIA-2
您可以使用 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
)
关闭群组
示例代码
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