[英]Why is the regex function to remove non-alphabetical character in a string not working?
我正在嘗試挑戰,我設法成功了,但在某種情況下它並沒有按照我想要的方式工作。
這是挑戰: Given a string, return whether or not it forms a palindrome ignoring case and non-alphabetical characters. Note: a palindrome is a sequence of characters that reads the same forwards and backwards. Ex: Given the following strings... "level", return true "algorithm", return false "A man, a plan, a canal: Panama.", return true
Given a string, return whether or not it forms a palindrome ignoring case and non-alphabetical characters. Note: a palindrome is a sequence of characters that reads the same forwards and backwards. Ex: Given the following strings... "level", return true "algorithm", return false "A man, a plan, a canal: Panama.", return true
這是我的代碼:
import re
def isPalindrome(str):
reversedString = re.sub(r'[^a-z]', '', str)
reversedString = str[::-1]
if reversedString == str:
print(True)
else:
print(False)
所以,當我輸入例如'level'時,它確實返回true,當我輸入算法時確實返回false,但問題是問題中的第三個示例仍然打印出false,而因為它是一個實際的回文,它應該返回假。 如果我們去掉所有非字母字符,例如點、逗號和列,它就是回文。 所以我很自然地瀏覽了互聯網,看看我們怎么可能做到這一點,發現使用正則表達式是最有效的方法,所以我將它實現到我的 function 中。 問題是,因為總是有一個,它實際上就像 regex 方法根本不存在一樣運行,它基本上不會刪除非字母字符,而它應該......所以,在這里我開始知道我可能做錯了,如果我有可能得到某人的幫助,因為我已經堅持了一天。
感謝大家閱讀本文!
首先,您的正則表達式將刪除大寫字母。 即使您修改了正則表達式以刪除非大寫和非小寫字母,您也會在下一行代碼中破壞您的結果( reversedString
)。
您確實需要首先將輸入字符串轉換為全部小寫或全部大寫(實際上是小寫,因為您要刪除非小寫字母),因為您的輸入是混合的,並且您的回文不會向前讀取相同的內容和倒退,除非你這樣做。
import re
def isPalindrome(str):
str = str.lower()
filteredString = re.sub(r'[^a-z]', '', str)
reversedString = filteredString[::-1]
if reversedString == filteredString:
print(True)
else:
print(False)
>>> isPalindrome("A man, a plan, a canal: Panama.")
True
您當前的方法有幾個問題,在替換不是字母數字字符后使主要的reversedString
小寫,然后在比較reversedString == str
str
從它自己的reversedString
制作 str ,我稍微更改了代碼塊,但相同的邏輯應該也可以使用您自己的版本。
import re
def isPalindrome(str):
reversedString = re.sub(r'[^a-zA-Z\\s]', '', str).lower()
str = reversedString[::-1]
if reversedString == str:
print(True)
else:
print(False)
isPalindrome('A man, a plan, a canal: Panama.')
您可以使用re.sub()
刪除所有非字母字符:
import re
def isPalindrome(s):
s = re.sub('[\W\d_]','',s).lower()
if s == s[::-1]:
return True
return False
print(isPalindrome("A man, a plan, a canal: Panama."))
print(isPalindrome("algorithm"))
print(isPalindrome("level"))
Output:
True
False
True
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.