2016-10-18 69 views
0

我对Python中的正则表达式有疑问。正则表达式来匹配Python中的几个字符串

可能的变化可以是

10小时,12周或7个工作日。

我想有我正则表达式像

string = "I have an 7 business day trip and 12 weeks vacation." 
re.findall(r'\d+\s(business)?\s(hours|weeks|days)', string) 

,这样我希望找到“7个工作日”和“12周”,但它返回无

+0

谢谢,我有正确的。但现在它返回没有数字的[(“business”,“day”),(“weeks”)]。 – Vicky

+0

现在,如果没有'business',你需要*两个*空格字符。 – Biffen

+0

你忘了匹配“business”和“12”之间的字符。 –

回答

2
string = "I have an 7 business day trip and 12 weeks vacation." 
print re.findall(r'\d+\s(?:business\s)?(?:hour|week|day)s?', string) 
['7 business day', '12 weeks'] 

\d+\s(?:business\s)?(?:hour|week|day)s? 

Debuggex Demo

演示应解释如何工作的。你的原因不是因为它正在寻找不匹配的7 businessdays

但如果你不想接受business week/hour,则需要进一步修改:

\d+\s(?:hour|week|(?:business)?day)s? 

Debuggex Demo

1

您需要调整您的正则表达式此:

>>> string = "I have an 7 business day trip and 12 weeks vacation." 
>>> print re.findall(r'(\d+)\s*(?:business day|hour|week)s?', string) 
['7', '12'] 

这个匹配后跟business dayhourweek和任选任何数目到底。

0

类似@ anubhava的答案,但匹配“7个工作日”,而不是只是“7”。刚刚从\ d +后移至右括号到最后:

re.findall(r'(\d+\s*(?:business day|hour|week)s?)', string) 
+0

如果您不包含任何捕获组,那么're.findall'默认会返回整个匹配,所以括号不是必需的。 – TemporalWolf

-2

\ d + \ S +(商业\ S)(小时|一周|天)■?

+1

代码只有答案通常不如解释如何或为什么有帮助。此外,还有一个代码格式化程序('{}'按钮) – TemporalWolf

+0

这不是代码片段,而是用于获取所需输出的正则表达式字符串。我本可以写下“你需要调整你的正则表达式”:但我认为这是相当暗示的。 – jazoora

+1

这仍然不能解释**为什么**这是正确的答案,或**如何正则表达式的工作(或者,或者,为什么他们的正则表达式不)。这些很重要。注意接受的答案提供了一个解决方案,他的方法无法正常工作的原因以及测试对象的演示。通常我也会做一个细分,但是如果点击链接,Debuggex在做视觉细分方面做得非常出色。 – TemporalWolf