簡體   English   中英

為什么正則表達式 function 刪除字符串中的非字母字符不起作用?

[英]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.')

工作演示: https://rextester.com/GBLTM37163

您可以使用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.

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