使用正则表达式执行分布式 属性

Execution of distributive property using regex

我正在尝试使用正则表达式更改顺序,但是 运行 出现了替代组的问题。

Example: 1a,1b,1c ABC
Output: ABC*1a,ABC*1b,ABC*1c

Example: 1a,2b ABC
Output: ABC*1a,ABC*2b

Example: 1a ABC
Output: ABC*1a

到目前为止我拥有的是:

re.sub(r'((\d\W,\d\W,\d\W)|(\d\W,\d\W)|(\d\W))()(\d\W\d\W\d\W)',r'\*',string)

关于如何处理可能的子组有什么想法吗?

我看到问题是关于正则表达式的,但是正如@Ronald 所说,使用它们来完全交换内容会相当困难。这是一个示例,您可以如何使用它们并将它们与 python 方法结合起来以获得您正在寻找的结果:

import re

def parse_string_1(str_):
    prog1 = re.compile('([\d\w]*)[\,\s]')
    prog2 = re.compile('\s(\w*)')

    constant = re.findall(prog2, str_)[0]
    multipliers = re.findall(prog1, str_)

    result = []
    for multiplier in multipliers: 
        result.append(f"{constant}*{multiplier}")
    return ','.join(result)

parse_string_1("1a,1b,1c ABC")
>>> ABC*1a,ABC*1b,ABC*1c
parse_string_1("1a,2b ABC")
>>> ABC*1a,ABC*2b
parse_string_1("1a ABC")
>>> ABC*1a

如果你可以完全离开它们,你可以这样做:

def parse_string_2(str_):
    result = []
    multipliers, constant = str_.split(' ')
    for multiplier in multipliers.split(','):
        result.append(f"{constant}*{multiplier}")
    return ','.join(result)

parse_string_2("1a,1b,1c ABC")
>>> ABC*1a,ABC*1b,ABC*1c
parse_string_2("1a,2b ABC")
>>> ABC*1a,ABC*2b
parse_string_2("1a ABC")
>>> ABC*1a

不使用正则表达式,可以考虑使用itertools.product:

from itertools import product
data=['1a,1b,1c ABC', '1a,2b ABC', '1a ABC']

for s in data:
    lst = [e.split(',') for e in s.split()]
    for prod in product(*lst):
        print('{}*{}'.format(prod[1], prod[0]))

可能是这样的:

import re
str = '1a,1b,1c ABC'
print(re.sub(r'(?=\d)', str.split()[1]+'*', str.split()[0]))

结果:

ABC*1a,ABC*1b,ABC*1c

对于该数据结构,您还可以使用 regex PyPi module\G 锚点

(?:\G(\d[a-zA-Z]+,?)| ([A-Z]+))

说明

  • (?:非捕获组
    • \G 断言上一场比赛结束
    • (\d[a-zA-Z]+,?) 捕获组 1,匹配 1+ 次字符 a-zA-Z 和可选的 ,
    • |
    • ([A-Z]+) 捕获组 1,匹配一个 space 和 1+ 个字符 A-Z
  • ) 关闭群组

Regex demo | Python demo

import regex

strings = [
    "1a,1b,1c ABC",
    "1a,2b ABC",
    "1a ABC"
]

for s in strings:
    tuples = regex.findall(r"(?:\G(\d[a-zA-Z]+,?)| ([A-Z]+))", s)
    prefix = ''.join(tuples.pop())
    result = "".join(f"{prefix}*{t[0]}" for t in tuples)
    print(result)

输出

ABC*1a,ABC*1b,ABC*1c
ABC*1a,ABC*2b
ABC*1a