python 正则表达式仅字母可变长度正/负lookbehind

llmtgqce  于 2022-12-10  发布在  Python
关注(0)|答案(1)|浏览(131)

假设我有一个像下面这样的文本:

Lorem-Ipsum is simply dummy text of-the printing and typesetting industry. abc123-xyz 1abcc-xy-ef apple.pear-banana asdddd-abc-cba

如果-位于字母字符(字母)和-[a-zA-Z-])之间,那么我想用空格替换-,直到空格之前/之后。因此,结果应该是:

Lorem Ipsum is simply dummy text of the printing and typesetting industry. abc123-xyz 1abcc-xy-ef apple.pear-banana asdddd abc cba

我试探着:
\b(?<=[a-zA-Z]+)\-(?=[a-zA-Z]+)\b这是无效的,因为lookbehind不允许使用量词,而且我猜即使它有效,也不能覆盖所有场景。
是否有一种方法可以使用可变长度的lookbehind,或者对于这种情况是否有其他方法?
编辑:使用Python re库

vfh0ocws

vfh0ocws1#

您可以使用

re.sub(r'(?<!\S)[a-zA-Z]+(?:-[a-zA-Z]+)+(?!\S)', lambda x: x.group().replace('-', ' '), text)

正则表达式匹配空格分隔的字母单词,其中至少有一个-。然后,所有连字符被替换为空格内的匹配。
请参阅regex demo。* 详细数据 *:

  • (?<!\S)-左侧空白边界
  • [a-zA-Z]+-一个或多个ASCII字母
  • (?:-[a-zA-Z]+)+-出现一个或多个-字符,然后出现一个或多个ASCII字母
  • (?!\S)-右侧空白边界。

[a-zA-Z]替换为[^\W\d_]以匹配任何Unicode字母单词。
请参阅Python demo

import re
text = r"Lorem-Ipsum is simply dummy text of-the printing and typesetting industry. abc123-xyz 1abcc-xy-ef apple.pear-banana asdddd-abc-cba"
print(re.sub(r'(?<!\S)[a-zA-Z]+(?:-[a-zA-Z]+)+(?!\S)', lambda x: x.group().replace('-', ' '), text))

输出量:

Lorem Ipsum is simply dummy text of the printing and typesetting industry. abc123-xyz 1abcc-xy-ef apple.pear-banana asdddd abc cba

相关问题