繁体   English   中英

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

[英]How do I use regular expressions to search for words in queries?

嗨,我目前正在研究查询求解器代码,并且正在使用正则表达式来搜索用户输入的查询中的单词。

但是,我遇到了这样一个难题:我使用的代码不能减轻我最初想法的概念。 代码如下:

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

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

正则表达式不是用于此的工具,并且您使用了不正确的工具。 [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匹配,但这与您使用的关键字shacked ,因为无论如何逻辑都是基本的。

我不清楚您的期望。 首先:查看正则表达式的文档,如果查询中包含三个字母w,e或t中的一个,则[wet]为true。 如果您尝试这样做,您会看到-如果插入“ wet”,几乎所有搜索都为真(w在[water]内,e在[screen] [hacked] [smashed]内,依此类推。依此类推。查找整个单词,您的正则表达式必须为“ wet”。如果只希望“ wet”而不是“ anywetthing”,则可以使用“ \\ 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()

但您不应在函数和输入字符串中使用名称“查询”。 还有一些更明智的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM