检查字符串是否包含数字,它们仅在字符串的末尾

Checking if string contains numbers, they are at the end of the string only

提问人:RyanG93 提问时间:10/27/2023 最后编辑:Timur ShtatlandRyanG93 更新时间:10/31/2023 访问量:130

问:

字符串只能包含字母,但如果它有数字,则它们后面不能有任何字母。 是有效的。 无效。RYAN93RYAN93G

我尝试使用循环来检查字符串中的每个字符。如果这是真的,我会检查.但这仍然会检查整个字符串,所以我不会得到我想要的结果。for.isnumeric().isalpha()

Python 正则表达式 字符串

评论

0赞 Barmar 10/27/2023
您是否尝试过使用正则表达式?
1赞 Barmar 10/27/2023
找到最后一位数字的位置。如果它不是字符串中的最后一个字符,则条件失败。
1赞 trincot 10/27/2023
空字符串是有效的输入吗?输入是否至少需要一个字母或全部为数字?

答:

2赞 Timur Shtatland 10/27/2023 #1

使用 re.search

import re

strs = ['RYAN93', 'RYAN93G', '93', 'RYAN92G3']


for s in strs:
    if re.search(r'^[A-Za-z]+[0-9]*$', s):
        print(s)

指纹:

RYAN93

评论

0赞 OysterShucker 10/27/2023
此答案也将仅匹配数字,这不是 OP 描述的规格。
0赞 trincot 10/27/2023
@OysterShucker,您如何确定只有数字不符合要求?
0赞 OysterShucker 10/27/2023
帖子的第一句话。
1赞 trincot 10/27/2023
我把第一段读了 10 遍,我不明白它怎么不允许只有数字。
0赞 OysterShucker 10/27/2023
我不知道该告诉你什么。我认为你对“可能”的看法是错误的。它不是“可能”中的“可能”,而是“允许”中的“可能”。“只能包含”~“只允许包含”。唯一的例外是以数字结尾。这意味着数字之前必须有一些东西。
2赞 OysterShucker 10/27/2023 #2

您可以使用正则表达式来满足您的需求。

re.compile(r'[a-z]+\d*$', re.I)- 此表达式表示:

  • [a-z]+一个或多个字母字符
  • \d*零位或多位数字
  • $直到字符串的末尾
  • re.I不区分大小写的匹配

match从字符串的开头开始匹配,因此,没有必要在表达式中专门说明这一点。

import re

items = ['939393', 'RYAN', 'RYAN93', 'RYAN93RYAN', 'RYAN93RYAN93']

match = re.compile(r'[a-z]+\d*$', re.I).match

valid = [item for item in items if match(item)]

print(valid) #[RYAN, RYAN93]
-1赞 OM222O 10/27/2023 #3

正则表达式确实有效,但对于如此简单的任务来说,这太过分了。只需从字符串的末尾循环到开头;如果你以字符串开头,那么你不应该遇到任何数字。如果你从一个数字开始,那么你就可以开始了:

strs = ['RYAN93', 'RYAN93G', 'ABCD', 'ABC123GH4', 'RYAN93G93']

def verify(s):
    is_previous_char_numeric = s[-1].isnumeric()
    for char in s[-2::-1]:
        if char.isnumeric() and not is_previous_char_numeric:
            return False
        is_previous_char_numeric = char.isnumeric()
    return True
        
for s in strs:
    print(f"Is {s} formatted correctly? {verify(s)}")

我讨厌这样做,但因为@OysterShucker无法自拔,这里有证据证明 O(n) 比 O(n^2) 更好,并且正则表达式不是某种黑魔法。

enter image description here

评论

2赞 Onyambu 10/27/2023
这是不正确的。也就是说,它将识别出一个文本,如ABC123GH4
2赞 OysterShucker 10/27/2023
这是行不通的。喂它.RYAN93G93
2赞 Onyambu 10/27/2023
另请注意,字符串 like 应该是有效的,因为它没有数字ABCD
0赞 OM222O 10/27/2023
我的印象是,如果它以数字结尾,它立即是正确的。我会更新答案
0赞 OM222O 10/27/2023
我理解你的意思,但即使在编写正则表达式时,您仍然需要考虑所有边缘情况以创建一个格式良好的正则表达式(上面的各种答案证明了这一点)。我知道正则表达式更方便并且可以创建更干净的代码,但它绝对是矫枉过正,而且很可能在较长的字符串上运行得更慢(我可能是错的,但我相信)它使用动态编程表来计算匹配项 O(n^2) 而我的解决方案是 O(n) 并且我的解决方案具有提前终止。