使用 python re 在波斯数字和字母之间添加 space

Add space between Persian numeric and letter with python re

我想在波斯语数字和波斯语字母之间添加space,像这样:

"سعید123" 转换为 "سعید 123"

Java 这个程序的代码如下。

str.replaceAll("(?<=\p{IsDigit})(?=\p{IsAlphabetic})", " ").

但我找不到任何python解决方案

我不确定这是否正确。

import re
k = "سعید123"
m = re.search("(\d+)", k)
if m:
    k = " ".join([m.group(), k.replace(m.group(), "")])
    print(k)

输出:

123 سعید

您可以使用

re.sub(r'([^\W\d_])(\d)', r' ', s, flags=re.U)

请注意,在 Python 3.x 中,re.U 标志是多余的,因为模式默认是 Unicode 识别的。

参见online Python demo and a regex demo

图案详情

  • ([^\W\d_]) - 捕获第 1 组:任何 Unicode 字母(字面意思是除非单词、数字或下划线字符以外的任何字符)
  • (\d) - 捕获第 2 组:任何 Unicode 数字

替换模式是第 1 组和第 2 组占位符(指相应的捕获值)与它们之间的 space 的组合。

您可以使用具有前瞻性的正则表达式的变体:

re.sub(r'[^\W\d_](?=\d)', r'\g<0> ', s)

this regex demo

有一个简短的正则表达式,您可以依靠它来匹配字母和数字之间的边界(任何语言):

\d(?=[^_\d\W])|[^_\d\W](?=\d)

Live demo

细分:

  • \d匹配一个数字
  • (?=[^_\d\W]) 语言字母前面
  • |
  • [^_\d\W] 匹配一种语言的字母
  • (?=\d) 前一个数字

Python:

re.sub(r'\d(?![_\d\W])|[^_\d\W](?!\D)', r'\g<0> ', str, flags = re.UNICODE)

但根据 this answer这是完成此任务的正确方法

re.sub(r'\d(?=[آابپتثجچحخدذرزژسشصضطظعغفقکگلمنوهی])|[آابپتثجچحخدذرزژسشصضطظعغفقکگلمنوهی](?=\d)', r'\g<0> ', str,  flags = re.UNICODE)