2012-02-09 38 views
0

我有字符串。我应该如何在Python中编写这个正则表达式

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

它不应该像:

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

我应该得到

['12345','7890'] 

我只取数值

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

+1

'[0-9] +''== \ d +' – juliomalegria 2012-02-09 18:17:09

回答

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

这里,

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

与@Ademiban的解决方案相同的问题:这将不会在'123 456'中找到'456',因为内部空间被第一场比赛“消耗”。 – 2012-02-09 18:20:04

+0

@JanPöschko:很好,谢谢。修正了(通过将最终组转换为前瞻断言)。 – NPE 2012-02-09 18:22:13

+0

@JanPöschko谢谢。它不适用于这个“12345 hai how?u @ 3456?awer12345 7890123ER%345 234 456 789” – Nava 2012-02-09 18:27:26

2

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

+1

此Wi在'123 456'中找不到'456',因为内部空间被第一场比赛“消耗”了。 – 2012-02-09 18:19:27

+0

你是对的... – shift66 2012-02-09 18:22:25

11

无需使用正则表达式:

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

我认为这是比使用正则表达式

+0

'i.isdigit()'...很好。 – phimuemue 2012-02-09 18:22:30

+0

+1不使用正则表达式。 – shift66 2012-02-09 18:27:49

0

你的表达更可读认定的数字全部序列,不管是什么围绕着他们。您需要包含序列前后内容的规范以获得您想要的行为:

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

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

+0

当他想要['12345','7890']时返回['3456','12345']。我越来越相信我的观点,即正则表达式比它们的价值更麻烦,除非它们微不足道。 – DSM 2012-02-09 18:28:05

3

科里的解决方案是真正走在这里的正确方法,但因为这个问题没问正则表达式,这里是一个正则表达式的解决方案,我认为这是比别人更简单:

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'] 
+0

用于扭曲的双负逻辑。邪恶。 :) – zx81 2014-08-08 10:37:34

相关问题