簡體   English   中英

如何在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM