提问人:RyanG93 提问时间:10/27/2023 最后编辑:Timur ShtatlandRyanG93 更新时间:10/31/2023 访问量:130
检查字符串是否包含数字,它们仅在字符串的末尾
Checking if string contains numbers, they are at the end of the string only
问:
字符串只能包含字母,但如果它有数字,则它们后面不能有任何字母。 是有效的。 无效。RYAN93
RYAN93G
我尝试使用循环来检查字符串中的每个字符。如果这是真的,我会检查.但这仍然会检查整个字符串,所以我不会得到我想要的结果。for
.isnumeric()
.isalpha()
答:
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) 更好,并且正则表达式不是某种黑魔法。
评论
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) 并且我的解决方案具有提前终止。
评论