0

我有一个要求,我有一个字符串输入,其中包含可能包含字母 [a-zA-Z] 和数字 [0-9] 的单词。我希望能够分隔每个这样的单词,以便在字母部分和数字部分之间插入一个空格。例如,对于字符串

"5n7x Jahalducro) P4J99UMH9 (MD) auntud C D T)", 

单词“P4J99UMH9”将转换为“P 4 J 99 UMH 9”我有几个正则表达式,它们在 Python 中使用 re.sub() 顺序执行此操作

import re
text = "5n7x Jahalducro) P4J99UMH9 (MD) auntud C D T)"
# For <alpha><number><alpha>    
text = re.sub(r'(?<=[a-zA-Z])([\d]+)(?=[a-zA-Z])', r' \1 '),text)
# For <alpha><number><space>
text = re.sub(r'(?<=[a-zA-Z])([\d]+)(?=\s)', r' \1')

现在我还希望能够在这些正则表达式不应该工作的字符串中标记某些单词。我想通过将它们括在一个特殊字符中来做到这一点,比如~

"5n7x Jahalducro) ~P4J99UMH9~ (MD) auntud C D T)"

我该如何为此编写正则表达式?

4

2 回答 2

0

您可以通过以下方式解决您的问题:

import re
s = "5n7x Jahalducro) P4J99UMH9 (MD) auntud C D T)"
word_to_enclose = '5n7x'
enclosed_s = re.sub(r'(%s)' % word_to_enclose, r'~\1~', s)
re.sub(r'((?:[A-Za-z](?=\d+(?![A-Za-z\d]*~)))' \
    + r'|(?:\d+(?=[A-Za-z](?![A-Za-z\d]*~))))', r'\1 ', enclosed_s)

结果将是:

'~5n7x~ Jahalducro) P 4 J 99 UMH 9 (MD) auntud C D T)'

正则表达式模式的解释:

它正在检查其中一种情况((?:...)|(?:...))。第一个是不以 ~ 结尾的单词中以数字结尾的字母[A-Za-z](?=\d+(?![A-Za-z\d]*~)。第二个是单词中以字母结尾\d+(?=[A-Za-z](?![A-Za-z\d]*~)但也不以~结尾的数字。对于此匹配,必须添加尾随空格。

于 2013-09-13T08:09:26.700 回答
0

您可以在正则表达式中添加积极的前瞻:

(?<=[a-zA-Z])([\d]+)(?=[a-zA-Z])(?=(?:[^~]*~[^~]*~[^~]*)*$)

正则表达式101演示

零件检查零件前面(?=(?:[^~]*~[^~]*~[^~]*)*$)是否有偶数个~(或没有)要匹配。

于 2013-09-13T07:07:57.060 回答