在交互中通过正则表达式传递变量

时间:2019-03-23 05:01:55

标签: python regex

我正在尝试通过正则表达式函数传递变量,但没有得到预期的结果

我尝试了以下代码,但未打印任何正则表达式结果:

w = ["the small ball","the ball small","small the ball","small ball the","ball the small", "sball smalls the"]
y = ["the", "small", "ball"]
for j in y:
    for i in w:
        item = j
        print(item)
        try:
            m = re.search(r"%s\w+" %item, i)
            print(m.string)
        except Exception:
            pass

对于列表y中的每个项目,我希望它返回列表w中的所有项目,但最后一次迭代除外,因为“ ball”不在字符串中单词的开头。但是,我根本没有任何结果。相反,删除了异常处理后,出现以下错误:

  

AttributeError:'NoneType'对象没有属性'string'

预期结果:

the
the small ball
the
the ball small
the
small the ball
the
small ball the
the
ball the small
the
sball smalls the

small
the small ball
small
the ball small
small
small the ball
small
small ball the
small
ball the small
small
sball smalls the

ball
the small ball
ball
the ball small
ball
small the ball
ball
small ball the
ball
ball the small
ball

应该针对所有列表w项目搜索列表y的每个实例。如果列表y中的单词包含在列表w中任何单词的开头,则它将返回列表w元素。因此,ball的最后一次迭代不返回任何值,因为它不包含在“ sball smalls the”中任何单词的开头,而其他迭代则返回值,因为它们产生了匹配项。

请问如何调整我的代码以获得预期结果?

1 个答案:

答案 0 :(得分:1)

首先关于异常:正如文档所说:

  

re.search(样式,字符串,标志= 0)

     

扫描字符串以查找正则表达式模式产生匹配项的第一个位置,然后返回相应的MatchObject实例。如果字符串中没有位置与模式匹配,则返回None;否则,返回None。请注意,这不同于在字符串中的某个位置找到零长度匹配项。

请参阅https://docs.python.org/2/library/re.html#re.search

因此,如果找不到要搜索的表达式,则会在此处获得None而不是m中的Match对象。在这种情况下,m没有属性。代替

 print(m.string)

尝试

if m is not None:
    print m.string
else:
    print ""

然后,如果您的文本后跟任何“单词”字符,则正则表达式匹配。即使在单词的中间开始比赛也没关系。

如果要检查匹配项是否以单词开头,则可以在开头使用“单词边界”特殊序列“ \ b”,即:

   m = re.search(r"\b%s" %item, i)