【问题标题】:Check if a string contains only characters from a regular expression [duplicate]检查字符串是否仅包含正则表达式中的字符[重复]
【发布时间】:2017-05-03 13:23:12
【问题描述】:

尝试使用给定的包含所有合法字符的正则表达式创建一个函数,如果字符串仅包含这些字符,则会被检查。 p>

例如

import re
legal_characters = r'[\*\-]' # Matches asterisc and dash characters

def is_legal(test_string):
    if re.match(legal_characters, test_string):
        print("Legal")
    else:
        print("Not legal")

is_legal("***---123")  # should print "Not legal"
is_legal("AbC123")     # should print "Not legal"
is_legal("*-*-*")      # should print "Legal"

输出:

Not legal
Not legal
Not legal

我真的不明白为什么。有人可以解释一下吗?

【问题讨论】:

  • 在 python 3.4 上测试:所有字符串都是合法的; re 仅匹配第一个字母 (<_sre.SRE_Match object; span=(0, 1), match='a'>)。
  • @hiroprotagonist 我选错了正则表达式。请查看修改后的描述..
  • TigerhawkT3 是对的,无论差异多么小,这都是重复的。请查看stackoverflow.com/questions/1323364/…,它也有更完整的答案。

标签: python regex python-3.x


【解决方案1】:

您不需要使用re。试试:

legal_characters = '*-'

def is_legal(test_string):
    for s in test_string:
        if s not in legal_characters:
            print("Not legal")
            return
    print("Legal")

输出是:

>>> is_legal("***---123")
Not legal
>>> is_legal("AbC123") 
Not legal
>>> is_legal("*-*-*")
Legal

【讨论】:

  • 请注意,这将包括括号作为允许的字符,它们不应该是。我建议定义legal_characters = {'*', '-'}。您也可以将其简化为def is_legal(test_string): return all(c in legal_characters for c in test_string)。
  • 好吧,我认为括号也是合法的。是的,我喜欢这种简化,但如果我理解正确的话,我认为他想要一个打印而不是返回的函数。
  • 这可能只是为了简化测试调用。
  • 好的,谢谢,我也按照简化建议对其进行了编辑。
  • 感谢您的回答。但是,正如我在问题中所说,我确实想使用正则表达式。除其他原因外,使用正则表达式会更快。
【解决方案2】:
import re
legal_characters = r'[*-]+' # Matches asterisc and dash characters

def is_legal(test_string):
    if re.fullmatch(legal_characters, test_string):
        print("Legal")
    else:
        print("Not legal")
is_legal("***---123")  # should print "Not legal"
is_legal("AbC123")     # should print "Not legal"
is_legal("*-*-*")      # should print "Legal"

出来:

Not legal
Not legal
Legal

第一:

特殊字符失去其特殊意义在集合中。为了 例如,[(+*)] 将匹配任何文字字符 '(', '+', '*' 或 ')'

比:

re.fullmatch(pattern, string, flags=0)

如果整个字符串匹配正则表达式模式,返回一个 对应的匹配对象。如果字符串不匹配,则返回 None 图案;请注意,这与零长度匹配不同。

【讨论】:

    【解决方案3】:

    这再现了你想要的:^ 匹配字符串的开头 $ 结尾。中间有重复的+ 字符\w = [A-Za-z0-9_]。

    legal_characters = '^\w+$'
    

    更新

    修改您的问题后,这是我的建议:

    ^ 匹配字符串的开头$ 结尾。在两者之间有重复的+ 元素[*-]:

    legal_characters = '^[*-]+$'
    

    没有必要用\转义*-。

    正如 Maroun Maroun 所指出的,您可以省略 ^,因为 match 无论如何都会扫描字符串的开头:

    legal_characters = '[*-]+$'
    

    【讨论】:

    • ^ 在使用 match 时不需要,因为它已经尝试从字符串的开头进行匹配。
    • @MarounMaroun:同意。谢谢!
    【解决方案4】:

    试试这个:

    import re
    legal_characters = r'\w+$' # Matches Unicode word characters
    r = re.compile(legal_characters)
    
    def is_legal(test_string):
        if re.match(r, test_string):
            print("Legal")
        else:
            print("Not legal")
    
    is_legal("aaaAA$")  # should print "Not legal"
    is_legal("AAAA***") # should print "Not legal"
    is_legal("AAABBB")  # should print "Legal"
    

    在 python 2.7.12 上测试。

    【讨论】:

      猜你喜欢
      • 2012-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-28
      • 1970-01-01
      • 2018-08-09
      • 1970-01-01
      相关资源
      最近更新 更多