避免在字符包围的子字符串上使用正则表达式

时间:2013-09-13 07:03:58

标签: python regex

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

"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)"

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

2 个答案:

答案 0 :(得分:0)

您可以在正则表达式中添加正向前瞻:

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

regex101 demo

(?=(?:[^~]*~[^~]*~[^~]*)*$)部分检查在要匹配的部分之前是否有偶数个~(或没有)。

答案 1 :(得分: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]*~)结尾的数字,也没有以〜结尾。对于此匹配,必须添加尾随空格。