【问题标题】:Check regex result in a list ,if-else python检查列表中的正则表达式结果,if-else python
【发布时间】:2014-04-08 14:02:07
【问题描述】:

我有一个单词列表(甚至 1 个对象中有 2 个或 3 个单词)。我已经编译了一个正则表达式来匹配列表中的任何单词到一个随机字符串。如果匹配,则返回列表的该对象,否则它将在字符串上执行另一个正则表达式以返回表达式。
我的代码:
“layouts”是单词列表,“layout_re”使用列表中的单词匹配字符串“str”。如果 ms 存在于 list 中,则返回 ms ,否则使用 p 的表达式返回模式。

def layout_corr(str):

    ms = layout_re.search(str)
    if ms in layouts:
       ms=ms

    else:
       p = re.compile(r'(?:\w+\s+){1,2}layout')
       ms = re.findall(p,str)
    return ms

我得到的输出是 else 语句的输出。
例如:- str = " no 804 8th main 2nd c cross hrbr layout 1st block"
该列表包含“hrbr 布局”,因此必须返回 hrbr 布局。但相反,该函数返回"cross hrbr layout",这是else语句计算的毫秒。if语句有什么问题??

【问题讨论】:

  • re.search 返回一个match 对象(或None),而re.findall 返回一个list。两者都没有返回纯对象匹配。

标签: python regex list if-statement


【解决方案1】:

re.search 返回一个匹配对象,而不是字符串,因此:

ms in layouts

将始终返回 false。改用这个:

def layout_corr(str):
    ms = layout_re.search(str)
    if ms:
       return ms.group()    
    else:
       p = re.compile(r'((?:\w+\s+){1,2})layout')
       ms = re.findall(p,str)
       return ms

【讨论】:

  • 如果你想修剪空格,你可以使用(\w+(?:\s+\w+)?)\s+layout 作为第二个正则表达式。
  • 另外,你应该避免使用str,因为它是一个函数名(已经在聊天中告诉你,但在这里也提到了)
【解决方案2】:

1) 将ms=ms 更改为return ms

2) 为了“捕捉”字符串"hrbr layout" - 换行:

p = re.compile(r'(?:\w+\s+){1,2}layout')

到:

p = re.compile(r' (\w+? layout)')

演示:

p = re.compile(r' (\w+? layout)')
ms = re.findall(p,"no  804  8th main 2nd c cross hrbr layout 1st block")
print(ms[0]) // prints: "hrbr layout"

【讨论】:

  • hrbr 在列表中。如果我使用这个表达式,那么它将总是在布局之前提取 1 个单词。我想要的是检查名为“布局”的列表中是否存在,如果存在则返回相同的内容。如果没有,则在布局之前返回 2 个单词。Hrbr在布局列表中,所以我希望第一条语句返回表达式
  • @Sword 在这种情况下将 ms=ms 更改为 return ms
猜你喜欢
  • 2012-10-26
  • 1970-01-01
  • 1970-01-01
  • 2018-11-21
  • 1970-01-01
  • 1970-01-01
  • 2013-05-01
  • 1970-01-01
  • 2021-10-07
相关资源
最近更新 更多