[英]Infix validation using regex in python
您可以使用此鏈接評估我的正則表達式。
我正在嘗試驗證中綴輸入是否采用正確的形式。
這是我的測試用例:
1 --> (12+4)^3-((13+2)-(4*5)) //should be correct
2 --> )3+7( //should be wrong
3 --> 2++ //should be wrong
4 --> 2+4- //should be wrong
5 --> (19*7)) //should be wrong
6 --> 2+8 //should be correct
所以現在你可能知道我在想什么了。 我修改了很多網站和問題並得出結論,我應該使用遞歸正則表達式。
所以我試着識別模式,然后我得到了這個(不正確的版本):
(^(\(?[0-9]+(\+\-\*\/\^)[0-9]*\))|^([0-9]+(\+\-\*\/\^)[0-9]+(?1)*))(?1)*$
我在 python 中使用正則表達式(不是重新)庫實現了它:
import regex
regex.search(r"(^(\(?[0-9]+(\+\-\*\/\^)[0-9]*\))|^([0-9]+(\+\-\*\/\^)[0-9]+(?1)*))(?1)*$","(12+4)^3-((13+2)-(4*5))") is not None
預期的 output 應該是True但我的 output 是False 。
我知道我的模式不正確,需要你的幫助。如果你知道更好的模式,那就太好了。謝謝。
我...得出結論,我應該使用遞歸正則表達式。
使用遞歸正則表達式確實可以做到這一點,這是regex
庫所支持的。
您嘗試的錯誤之一是(\+\-\*\/\^)
不代表運算符的選擇,而是要求所有運算符都按該順序出現。 您需要[+*/^-]
語法。
我會建議這個正則表達式:
result = regex.match(r"^(([+-]*\d+|\((?1)\))([+^*/-](?2))*)$", s)
這假設您的輸入沒有空格,並且數字文字是(帶符號的)整數。
解釋:
[+-]*
:這兩個字符的任意序列,用作一元運算符。 +
在這個意義上是一個無用的運算符,但它是允許的。\d+
:任何非空數字序列,表示無符號 integer(?1)
:遞歸。 這將使用整個正則表達式——除了^
和$
錨點。 -- 以遞歸方式,使用周圍的文字括號。 這允許表達式嵌套。[+^*/-]
:任何二元運算符(根據需要擴展更多運算符)(?2)
:匹配二元運算符的第二個操作數,重新使用與匹配第一個操作數相同的模式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.