2

我试图在不断变化的数据字符串上使用各种正则表达式从字符串中提取某些部分。

例如,下面的两个正则表达式应该只拉:Example $00.00bla $00.00

data = "Maybe Example $00.00 test $00.00 bla $00.00 dasdsadasd"
pull1 = re.match(r'^(Example) (\D\w+\D\w+)', data)
pull2 = re.match(r'^(bla) (\D\w+\D\w+)', data)

有人知道我在做什么错吗?

提前致谢 - Hyflex

4

5 回答 5

5

如果要提取部分字符串,请使用“搜索”而不是“匹配”。此代码工作正常:

data = "Maybe Example $00.00 test $00.00 bla $00.00 dasdsadasd"
pull1 = re.search(r'(Example) (\D\w+\D\w+)', data)
pull2 = re.search(r'(bla) (\D\w+\D\w+)', data)

print pull1.group(0)
print pull2.group(0)

我已从您的正则表达式中删除了“^”。

祝你好运!

于 2013-09-27T02:00:02.540 回答
3

match()限制匹配从字符串的开头开始(请参阅文档)。你想要search()。而且您也不希望^在正则表达式的开头:这也会强制匹配从字符串的开头开始。从字符串的开头开始,您的模式无法匹配data

于 2013-09-27T01:58:05.460 回答
3

尝试:\b((Example|bla)\s\$(\d{2})\.\3)\b

  • \b- 开始词边界
  • (- 开始比赛#1
  • (Example|bla)- 比赛#2
  • \s- 空间
  • \$- 美元符号
  • (\d{2})- 第 3 场比赛:2 位数
  • \.- 小数位
  • \3- 重复比赛#3
  • )- 结束比赛#1
  • \b- 结束词边界

实际操作:RegexPal

于 2013-09-27T01:59:24.410 回答
3

re.match() 匹配字符串开头的模式。如果您希望它识别字符串中任何位置的模式,请使用 search() 而不是 match()。此外,在搜索中使用“^”将其限制在字符串的开头。

在您的示例中,您试图匹配字符串开头的“示例”,该字符串返回 None ,因为它没有找到。检查以获取更多信息!

于 2013-09-27T02:05:18.007 回答
2

'^' 表示从换行符开始,或字符串的开头(由 1_CR 指出)。所以只要它在那里,它就永远不会匹配任何东西。

在任何情况下,我都会使用 findall,然后解析出您以后不想要的“测试”值。

re.findall(r'(.*?)\s(\$.*?)\s', data)

将返回

[('Maybe Example', '$00.00'), ('test', '$00.00'), ('bla', '$00.00')]
于 2013-09-27T02:04:00.513 回答