Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正则表达式,其中模式的一部分是可选的。_Python_Regex - Fatal编程技术网

Python 正则表达式,其中模式的一部分是可选的。

Python 正则表达式,其中模式的一部分是可选的。,python,regex,Python,Regex,我正在做一个纵横字谜编译器 例如,假设有8个空白点,第二个点为“U”,第四个点为“E”,第六个点为“E” _U____E___ 我有一个单词列表,我正试图从中找到与此匹配的单词。如果我发现一个8个字母的单词有这种模式(无内胎),太好了!。但是如果我能找到一个4个字母的单词,它只匹配前4个槽(管),我也可以使用它 我可以为每个可能的长度使用一个RE,并使用“|”组合它们,但我正在寻找一个更优雅的解决方案。帮忙 包含所需匹配项的4到8个字符的字符串是: >>> p = re.com

我正在做一个纵横字谜编译器

例如,假设有8个空白点,第二个点为“U”,第四个点为“E”,第六个点为“E”

_U____E___

我有一个单词列表,我正试图从中找到与此匹配的单词。如果我发现一个8个字母的单词有这种模式(无内胎),太好了!。但是如果我能找到一个4个字母的单词,它只匹配前4个槽(管),我也可以使用它


我可以为每个可能的长度使用一个RE,并使用“|”组合它们,但我正在寻找一个更优雅的解决方案。帮忙

包含所需匹配项的4到8个字符的字符串是:

>>> p = re.compile('^[A-Z]U[A-Z]E(?=[A-Z](?=E(?=[A-Z](?=[A-Z]$|$)|$)|$)|$)')
>>> re.match(p, 'TUB')
>>> re.match(p, 'TUBE')
<_sre.SRE_Match object at 0x10fe55ac0>
>>> re.match(p, 'TUBX')
>>> re.match(p, 'TUBEL')
<_sre.SRE_Match object at 0x10fe55b28>
>>> re.match(p, 'TUBELE')
<_sre.SRE_Match object at 0x10fe55ac0>
>>> re.match(p, 'TUBELEX')
<_sre.SRE_Match object at 0x10fe55b28>
>>> re.match(p, 'TUBELES')
<_sre.SRE_Match object at 0x10fe55ac0>
>>> re.match(p, 'TUBELESS')
<_sre.SRE_Match object at 0x10fe55b28>
>>> re.match(p, 'TUBELESSY')
>>> re.match(p, 'TUBELESS7')
>>> re.match(p, 'TUBELEZZ')
<_sre.SRE_Match object at 0x10fe55ac0>
>>> re.match(p, 'TUBELE88')
p=re.compile(“^[A-Z]U[A-Z]E(?=[A-Z](?=E(?=[A-Z](?=[A-Z]$|$)|$)|$)|$)) >>>关于匹配(p,‘桶’) >>>关于匹配(p,‘管’) >>>关于匹配(p,‘TUBX’) >>>关于匹配(p,‘管’) >>>关于匹配(p,‘管’) >>>关于匹配(p,‘TUBELEX’) >>>关于匹配(p,‘管’) >>>关于匹配(p,“无内胎”) >>>关于匹配(p,“结节性病变”) >>>关于匹配(p,‘无管7’) >>>关于匹配(p,‘TUBELEZZ’) >>>关于匹配(p,‘TUBELE88’) 我不确定这是否“更优雅”,但这是一个有趣的前瞻性说明。也许它会给你带来一些想法

text = "_U_E_E___"
def solve(text, word_list):
    for word in word_list:
        matches = 0
        for c1, c2 in zip(text, word):
            if not(c1 == c2 or c1 == '_'):
                break
            matches += 1 
        if matches >= 4:
            return word


print solve(text, ['TXBELESS', 'TUBE'])
print solve(text, ['TXBELESS', 'TUBx', 'TUBELESS', 'TUBEL'])
输出:

TUBE
TUBELESS

这里有一个更简洁的正则表达式。我假设词典中的单词没有数字,所以匹配字母数字字符不会有问题。如果不是这样,只需将表达式中的
\w
替换为
[A-Z]

import re

#REGEX EDIT:
#added so that the expression can't be embedded in another string
# ^ = beginning, $ = end

#to match words that are either 4 or 8 characters long:
#specify a group of 4 letters at the end, then match it 0 or 1 times with "?"
regex = re.compile(r"^\wU\wE(\wE\w{2})?$")

x = 'TUBELESS'
y = 'TUBE'

#both these options return a match object
#meaning they fit the regular expression
regex.match(x)
regex.match(y)

使用嵌套的可选组:
.U.E(?:(?:E(?:…?)?$

您可以使用一个简单的递归函数来构建模式:(几乎相同的模式,但即使最后一个字符也被包装在一个组中)

印刷品

TUB False
TUBE True
TEBU False
TUBES True
PURETE True
TUBELEX True
TUBELESS True
SURELY False

虽然这段代码可以工作,但我正在寻找一个正则表达式。Ref:“TUBE”和“TUBEXXX”都将返回具有给定RE的匹配对象,这不适合我所寻找的对象。谢谢,你说得对。我忘记了match函数在字符串中的任何位置找到表达式时返回true。我添加了开头和结尾字符以使其工作。这确实是一个有趣的前瞻性用法,可以完成我想做的事情。但我必须和詹妮·卡里拉一起寻求更全面的答案。谢谢
TUB False
TUBE True
TEBU False
TUBES True
PURETE True
TUBELEX True
TUBELESS True
SURELY False