Python 根据正则表达式中的字母数字连接生成变体

Python 根据正则表达式中的字母数字连接生成变体,python,regex,Python,Regex,我有一个单词列表,其中一些是单字,一些是多字,这些单词可能有数字字符,也可能没有数字字符 例如—— word\u list=['word','kap1','other word','other-1 word','other-1 word','other-word-1'] 我想识别列表中的单个单词条目,形式如下- 字母*连接*数字 其中,连接可以是空格、连字符或无。例如,在上面的列表中,kap1符合条件(没有其他条目符合条件)。现在,找到这个条目后,我想创建这个条目的变体(基于连接),并将它们添加

我有一个单词列表,其中一些是单字,一些是多字,这些单词可能有数字字符,也可能没有数字字符

例如——

word\u list=['word','kap1','other word','other-1 word','other-1 word','other-word-1']

我想识别列表中的单个单词条目,形式如下-

字母*连接*数字

其中,连接可以是空格、连字符或无。例如,在上面的列表中,
kap1
符合条件(没有其他条目符合条件)。现在,找到这个条目后,我想创建这个条目的变体(基于连接),并将它们添加到列表中

例如,找到了
kap1
,我想将
kap1
kap-1
添加到列表中

我能够编写用于识别条目的初始正则表达式-

Word\u NumberRegex=re.compile(r“^[a-zA-Z]+[-]?\d+$”


但我想知道一个创建变体的好算法,这取决于连接

使用
re
,您可以捕获匹配的图案,并使用自定义分隔符重新格式化:

word_list=['word', 'kap1','another word', 'another-1 word', 'another word 1']

import re    
p = r'([a-zA-Z]+)[- ]?([0-9]+)'
[re.sub(p, r'\1{}\2'.format(sep), w) for w in word_list if re.fullmatch(p, w) for sep in ['', ' ', '-']]

# ['kap1', 'kap 1', 'kap-1']
预编译模式:

p = re.compile(r'([a-zA-Z]+)[- ]?([0-9]+)')
[p.sub(r'\1{}\2'.format(sep), w) for w in word_list if p.fullmatch(w) for sep in ['', ' ', '-']]
​
# ['kap1', 'kap 1', 'kap-1']

使用
re
,您可以捕获匹配的图案,并使用自定义分隔符重新格式化:

word_list=['word', 'kap1','another word', 'another-1 word', 'another word 1']

import re    
p = r'([a-zA-Z]+)[- ]?([0-9]+)'
[re.sub(p, r'\1{}\2'.format(sep), w) for w in word_list if re.fullmatch(p, w) for sep in ['', ' ', '-']]

# ['kap1', 'kap 1', 'kap-1']
预编译模式:

p = re.compile(r'([a-zA-Z]+)[- ]?([0-9]+)')
[p.sub(r'\1{}\2'.format(sep), w) for w in word_list if p.fullmatch(w) for sep in ['', ' ', '-']]
​
# ['kap1', 'kap 1', 'kap-1']

您可以使用3个捕获组,并使用中间组捕获连接字符。使用连接字符搜索分隔符列表并获得所需的输出:

import re

word_list=['word', 'kap1', 'another word', 'abc-123', 'another-1 word', 'another word 1']

reg = re.compile(r'^([a-zA-Z]+)([- ]?)([0-9]+)$')

for w in word_list:
   m = reg.match(w)
   if m:
      result = []
      seps = ['', ' ', '-']
      seps.remove(m.group(2))
      for s in seps:
         result += [m.group(1) + s + m.group(3)]
      print result
输出:

['kap 1', 'kap-1']
['abc123', 'abc 123']

您可以使用3个捕获组并使用中间组捕获连接字符。使用连接字符搜索分隔符列表并获得所需的输出:

import re

word_list=['word', 'kap1', 'another word', 'abc-123', 'another-1 word', 'another word 1']

reg = re.compile(r'^([a-zA-Z]+)([- ]?)([0-9]+)$')

for w in word_list:
   m = reg.match(w)
   if m:
      result = []
      seps = ['', ' ', '-']
      seps.remove(m.group(2))
      for s in seps:
         result += [m.group(1) + s + m.group(3)]
      print result
输出:

['kap 1', 'kap-1']
['abc123', 'abc 123']

A-z范围不只包含字母,请参见ASCII表。使用此正则表达式验证并获取两个捕获组中的两个值。稍后使用这2个值创建变量。
A-z
范围不包含字母,请参见ASCII表。使用此正则表达式可验证并获取2个捕获组中的2个值。稍后使用这两个值来创建变量。如果列表中没有
kap1
,而是
kap-1
,则输出应该是
['kap1','kap1']
。你的程序给出了
['kap 1','kap-1']
如果你想要所有三个变量,你可以在分隔符中添加一个空字符串。我的想法更像是,如果单词有一个分隔符,那么代码应该给我另外两个变量,但我想我可以在以后删除重复的,而不是
kap1
,列表中有
kap-1
,那么输出应该是
['kap1','kap1']
。你的程序给出了
['kap 1','kap-1']
如果你想要所有三个变量,你可以在分隔符中添加一个空字符串。我想,如果单词有一个分隔符,那么代码应该给我另外两个变量,但我想我可以在以后删除重复的内容。我想你应该有
seps=['',-']
在for循环中,因为当前您从
seps
列表中永久删除了
元素,因此如果单词列表中有多个匹配的单词,代码将无法正常工作。我认为您应该在for循环中使用
seps=['','-']
,因为当前您从
seps
列表中永久删除了
元素,所以如果单词列表中有多个匹配的单词,代码将无法正常工作