我应该如何在python中编写这个正则表达式

时间:2012-02-09 18:12:19

标签: python regex

我有字符串。

st = "12345 hai how  r u @3456? Awer12345 7890"
re.findall('([0-9]+)',st)

它应该不会像:

['12345', '3456', '12345', '7890']

我应该

['12345','7890']

我应该只取数值

它不应包含任何其他字符,如字母,特殊字符

5 个答案:

答案 0 :(得分:11)

无需使用正则表达式:

[i for i in st.split(" ") if i.isdigit()]

我认为这比使用正则表达式更具可读性

答案 1 :(得分:3)

Corey的解决方案真的是走到这里的正确方法,但既然问题确实要求正则表达式,那么这是一个我认为比其他解决方案更简单的正则表达式解决方案:

re.findall(r'(?<!\S)\d+(?!\S)', st)

并作出解释:

(?<!\S)   # Fail if the previous character (if one exists) isn't whitespace
\d+       # Match one or more digits
(?!\S)    # Fail if the next character (if one exists) isn't whitespace

一些例子:

>>> re.findall(r'(?<!\S)\d+(?!\S)', '12345 hai how  r u @3456? Awer12345 7890')
['12345', '7890']
>>> re.findall(r'(?<!\S)\d+(?!\S)', '12345 hai how r u @3456? Awer12345 7890123ER%345 234 456 789')
['12345', '234', '456', '789']

答案 2 :(得分:2)

使用此:(^|\s)[0-9]+(\s|$)模式。 (^|\s)表示您的号码必须位于字符串的开头,或者号码前必须有空白字符。并且(\s|$)表示在数字后面必须有空格,或者数字在字符串的末尾 正如JanPöschko所说,在123 456中找不到456。如果你的“坏”部分(@,Awer)总是前缀,你可以使用这个(^|\s)[0-9]+模式,一切都会好的。它将匹配所有数字,这些数字在字符串之前或之前只有空格。希望这有助于......

答案 3 :(得分:2)

In [21]: re.findall(r'(?:^|\s)(\d+)(?=$|\s)', st)
Out[21]: ['12345', '7890']

下面,

  • (?:^|\s)是一个非捕获组,它匹配字符串的开头或空格。
  • (\d+)是一个匹配一个或多个数字的捕获组。
  • (?=$|\s)是与字符串末尾匹配的前瞻断言,或者是空格而不消耗它

答案 4 :(得分:0)

您的表达式会查找所有数字序列,而不管它们周围的数字。您需要包含序列之前和之后的内容规范,以获得所需的行为:

re.findall(r"[\D\b](\d+)[\D\b]", st)

会做你想要的。在英语中,它表示“匹配由非数字字符包围的一个或多个数字的所有序列。或字边界”