如何使用正则表达式在查询中搜索单词?

时间:2016-12-12 15:29:17

标签: python

您好我正在处理查询解算器代码,我使用正则表达式搜索用户输入的查询中的单词。

但是我想到了我所使用的代码并没有使我原来的想法概念化的困境。代码如下:

def query():
    print ('Enter a query\n\nThe query must not have more than 30 characters.\n')
    while True:
        query = raw_input ('Query:  ')
        if 30> len(query):
            break
            print ('The query must have less than 30 chracters.\n')

def querysolver():
    query_words = dict.fromkeys(['screen_repair','Phone_virus','Water_damage', False])
    if re.search (r'[wet]', query):
                  query_words['Water_damage'] = True
    if re.search (r'[water]', query):
                  query_words['Water_damage'] = True
    if re.search (r'[wet]', query):
                  query_words['Water_damage'] = True
    if re.search (r'[screen]', query):
                  query_words['screen_repair'] = True
    if re.search (r'[smashed]', query):
                  query_words['screen_repair'] = True
    if re.search (r'[hacked]', query):
                  query_words['Phone_virus'] = True
    if re.search (r'[virus]', query):
                  query_words['Phone_virus'] = True

我如何使用这些值来查找用户查询的解决方案?

2 个答案:

答案 0 :(得分:2)

正则表达式不适用于此,并且您使用的方法不正确。 [wet]将匹配'w','e'或't'。

您在此代码示例中所做的工作可以更容易地表达如下:

if 'wet' in query or 'water' in query:
      query_words['Water_damage'] = True
if 'screen' in query or 'smashed' in query:
      query_words['screen_repair'] = True
if 'hacked' in query or 'virus' in query:
      query_words['Phone_virus'] = True

当然in不检查字边界,因此这将匹配shacked,但这不应该是您正在使用的关键字的问题,因为无论如何逻辑都是基本的。

答案 1 :(得分:0)

我不清楚你的期望。 首先:看一下正则表达式的文档,[wet]是真的,如果三个字母w,e或t中的一个在查询中。如果你试试这个,你会看到 - 如果你插入“湿”几乎你所有的搜索都是真的(w在[water]里面,e在[screen] [hacked] [smashed]里面等等。 如果你想查找整个单词,你的正则表达式必须是“湿的”。如果你只想要“湿”而不是“任何东西”你可以使用“\ bwet \ b”,因为“\ b”匹配分词。

但是还有一些问题:你想如何将你的输入发送到计算(“querysolver”)?要通过变量“查询”执行此操作,您会遇到一些问题。

您可以执行以下操作:

import re 
def query():
    print ('Enter a query\n\nThe query must not have more than 30 characters.\n')
    while True:
        query = raw_input ('Query:  ')
        print len(query), query
        if 30 < len(query):
            print ('The query must have less than 30 chracters.\n')
            break
        else:
            print querysolver(query)


def querysolver(query):
    query_words = dict.fromkeys(['screen_repair','Phone_virus','Water_damage', False])
    if re.search (r'wet', query):
                  query_words['Water_damage'] = True
    if re.search (r'water', query):
                  query_words['Water_damage'] = True
    if re.search (r'wet', query):
                  query_words['Water_damage'] = True
    if re.search (r'screen', query):
                  query_words['screen_repair'] = True
    if re.search (r'smashed', query):
                  query_words['screen_repair'] = True
    if re.search (r'hacked', query):
                  query_words['Phone_virus'] = True
    if re.search (r'virus', query):
                  query_words['Phone_virus'] = True
    return query_words

query()

但是你不应该为函数和输入字符串使用名称“query”。 你的if- construct

还有一些更聪明的方法

一个例子(不完美,但更好地扩展到更多模式):

def querysolver2(query):
    query_words = dict.fromkeys(['screen_repair','Phone_virus','Water_damage'])
    for pattern in ['wet','water']:
        pattern = r'\b'+pattern+r'\b'
        if re.search(pattern,query):
            query_words['Water_damage'] = True
    for pattern in ['screen','smashed']:
        pattern = r'\b'+pattern+r'\b'
        if re.search(pattern,query):
            query_words['screen_repair'] = True
    for pattern in ['hacked','virus']:
        pattern = r'\b'+pattern+r'\b'
        if re.search(pattern,query):
            query_words['Phone_virus'] = True
    return query_words
相关问题