Python regex如何在字母和数字之间插入连字符;并删除两个字母之间的连字符
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python regex如何在字母和数字之间插入连字符;并删除两个字母之间的连字符相关的知识,希望对你有一定的参考价值。
我正在尝试使用正则表达式在字符串中执行以下操作:
- 如果两个字母之间有连字符
-
,我们必须将其删除:- 示例
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
- [
)
封闭组
示例代码
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
另一答案
如果要使用re.sub
,那么这是使用捕获组的一种方法:
inp = "8T-ENI-A2"
output = re.sub(r'^(.)(.)-([^-]+)-(.)(.)$', '\\1-\\2\\3\\4-\\5', inp)
print(output)
此打印:
8-TENIA-2
以上是关于Python regex如何在字母和数字之间插入连字符;并删除两个字母之间的连字符的主要内容,如果未能解决你的问题,请参考以下文章
Winforms 文本框允许用户只输入字母、数字、点和单词之间的空格。正则表达式
Regex.Replace 中的 MatchEvaluator 如何工作?