![](/img/trans.png)
[英]How do I search for text in a page using regular expressions in Python?
[英]How do I use regular expressions in Python with placeholder text?
我正在用Python做一個項目,我要求用戶輸入文本。 如果文本與程序支持的格式匹配,它將輸出包含用戶關鍵字的響應(它是一個簡單的聊天機器人)。 格式作為用戶輸入格式和答案格式存儲在文本文件中。
例如,文本文件如下所示,左側是用戶輸入,右側是輸出:
my name is <-name> | Hi there, <-name>
因此,如果用戶寫my name is johnny
,我希望程序知道johnny
是<-name>
變量,然后打印響應Hi there, johnny
。
有些人在正確的方向上刺激我會很棒! 我之前從未使用過正則表達式,我讀過一篇關於如何使用它們的文章,但不幸的是它並沒有真正幫助我,因為它主要是如何匹配特定的單詞。
這是一個例子:
import re
io = [
('my name is (?P<name>\w+)', 'Hi there, {name}'),
]
string = input('> ')
for regex, output in io:
match = re.match(regex, string)
if match:
print(output.format(**match.groupdict()))
break
我會帶你通過它:
'my name is (?P<name>\w+)'
(?P<name>...)
將以下部分( \\w+
(?P<name>...)
存儲在我們稍后將要使用的匹配對象中的名稱name
下。
match = re.match(regex, string)
這會在給定的輸入中查找regex
。 請注意, re.match
僅匹配輸入的開頭 ,如果您不希望該限制,請使用re.search
。
如果匹配:
output.format(**match.groupdict())
match.groupdict
返回由(?P<name>...)
定義的鍵字典及其相關的匹配值。 **
將這些鍵/值傳遞給.format
,在這種情況下,Python會將其轉換為output.format(name='matchedname')
。
要從文件構造io
字典,請執行以下操作:
io = []
with open('input.txt') as file_:
for line in file:
key, value = line.rsplit(' | ', 1)
io.append(tuple(key, value))
您將要進行組匹配,然后拉出搜索組。
首先你要import re
-re是python regex模塊。 讓我們說user_input是保存輸入字符串的var。 然后,您希望使用re.sub方法匹配您的字符串並返回替換它的東西。
output = re.sub(input_regex, output_regex, user_input)
所以正則表達式,首先你可以把你想要的絕對東西:
input_regex = 'my name is '
如果您希望它從行的開頭明確匹配,您應該使用插入符號繼續它:
input_regex = '^my name is '
然后你想要一個組匹配任何字符串。+(。是任何東西,+是前面項目的1或更多)直到'$'行結束。
input_regex = '^my name is .+$'
現在你想把它放到一個命名組中。 命名組采用“(?Pregex)”形式 - 請注意,這些尖括號是字面的。
input_regex = '^my name is (?P<name>.+)$'
您現在有一個匹配的正則表達式,並給出一個名為“name”的匹配組,其中包含用戶名。 輸出字符串需要使用“\\ g”引用匹配組
output_regex = 'Hi there, \\g<name>'
總而言之,你可以在一個班輪(和導入)中做到這一點:
import re
output = re.sub('^my name is (?P<name>.+)$', 'Hi there, \g<name>', user_input)
要求REGEXP不可避免地會得到像你現在得到的那樣的答案:基本REGEXP操作的演示:如何分割句子,搜索某些術語組合,如“我的”+“名稱”+“是”等等。
事實上,您可以通過閱讀現有文檔和開源程序來學習所有這些。 REGEXP並不容易。 如果你想改變和擴展你的程序,你仍然需要了解自己能夠真正了解正在發生的事情。 不要只是從這里的收據復制。
但你甚至可能想要更全面的東西。 因為你提到建立一個“聊天機器人”,你可能希望看到其他人如何接近這個任務 - 超越REGEXP。 看到:
因此,如果用戶寫'我的名字是johnny',我希望程序知道'johnny'是'<--name>'變量,...
從你的問題來看,目前還不清楚,該計划應該變得多么復雜。 什么,如果他打字
'Johnny is my name.'
要么
'Hey, my name is John X., but call me johnny.'
?
看看re模塊並注意捕獲組。
例如,您可以假設名稱將是一個單詞,因此它匹配\\w+
。 然后你必須使用\\w+
捕獲組構建一個正則表達式,其名稱應該是(捕獲組由括號分隔):
r'my name is (\w+)'
然后將其與輸入匹配(提示:在re
模塊文檔中查找match
)。
獲得匹配后,您必須獲取捕獲組的內容(在此情況下為索引1,索引0保留用於整個匹配)並使用它來構建響應。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.