使用正则表达式执行分布式 属性
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
)
关闭群组
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
我正在尝试使用正则表达式更改顺序,但是 运行 出现了替代组的问题。
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
)
关闭群组
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