您好我正在处理查询解算器代码,我使用正则表达式搜索用户输入的查询中的单词。
但是我想到了我所使用的代码并没有使我原来的想法概念化的困境。代码如下:
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
我如何使用这些值来查找用户查询的解决方案?
答案 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