在Python中检查字符串与字符

1 投票
4 回答
815 浏览
提问于 2025-04-15 15:53

我需要能够区分两种字符串:一种是可以包含字母和数字的字符串,另一种是可以包含数字、冒号和连字符的字符串。

>>> def checkString(s):
...   pattern = r'[-:0-9]'
...   if re.search(pattern,s):
...     print "Matches pattern."
...   else:
...     print "Does not match pattern."

# 3 Numbers seperated by colons. 12, 24 and minus 14
>>> s1 = "12:24:-14"
# String containing letters and string containing letters/numbers.
>>> s2 = "hello"
>>> s3 = "hello2"

当我对上面每个字符串运行checkString方法时:

>>>checkString(s1)
Matches Pattern.
>>>checkString(s2)
Does not match Pattern.
>>>checkString(s3)
Matches Pattern

s3是唯一一个不符合我要求的字符串。我想创建一个正则表达式,它只允许数字、冒号和连字符,但排除其他所有字符(或者只排除字母)。有没有人能给我一些建议?

编辑:

因此,我需要一个正则表达式,它可以接受:

229            // number
187:657        //two numbers
187:678:-765   // two pos and 1 neg numbers

并拒绝:

Car          //characters
Car2         //characters and numbers

4 个回答

0

在编程中,有时候我们需要处理一些数据,比如从一个地方获取数据,然后在程序中使用这些数据。这个过程就像是从冰箱里拿食材,然后用这些食材做饭一样。

有些时候,我们会遇到一些问题,比如数据格式不对,或者数据没有按我们想要的方式出现。这就像是你打开冰箱,发现食材坏掉了,或者你找不到你想要的食材一样。

为了避免这些问题,我们可以在程序中添加一些检查,确保我们拿到的数据是正确的。这就像是在做饭之前先检查一下冰箱里的食材是否新鲜,是否足够。

总之,处理数据就像做饭一样,需要仔细检查和准备,才能做出美味的菜肴。

pattern = r'\A([^-:0-9]+|[A-Za-z0-9])\Z'
1

SilentGhost的回答挺不错的,但要注意,它也会匹配像"---::::"这样的字符串,里面根本没有数字。

我觉得你需要的是这样的东西:

'^(-?\d+:)*-?\d+$'
  • ^ 表示行的开头。
  • (-?\d+:)* 可能有一个负号,至少一个数字,后面跟一个冒号。这个模式可以出现零次或多次。
  • -?\d+ 然后再出现一次这个模式,至少要有一个数字,但没有冒号。
  • $ 表示行的结尾。

这样会更好地匹配你描述的字符串。

5

你需要匹配整个字符串,而不是像现在这样只匹配一个字符:

>>> re.search('^[-:0-9]+$', "12:24:-14")
<_sre.SRE_Match object at 0x01013758>
>>> re.search('^[-:0-9]+$', "hello")
>>> re.search('^[-:0-9]+$', "hello2")

来解释一下正则表达式:

  • 在方括号内(字符类):可以匹配数字0到9、连字符和冒号,每个字符只匹配一次。
  • + 是一个量词,表示前面的表达式可以匹配尽可能多的次数,但至少要匹配一次。
  • ^$ 分别匹配字符串的开始和结束。对于单行字符串来说,它们相当于 \A\Z

这样,你就限制了整个字符串的内容,要求它至少有一个字符,并且包含字符类中的任意组合。你之前的做法是试图在目标字符串中寻找字符类中的单个字符。这就是为什么包含数字的 s3 能够匹配的原因。

撰写回答