2016-09-20 36 views
0

我想從文本中提取所有字符串和數字編號。使用正則表達式提取所有數字和文字編號

text = 'one tweo three 10 number' 
numbers = "(^a(?=\s)|one|two|three|four|five|six|seven|eight|nine|ten| \ 
      eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen| \ 
      eighteen|nineteen|twenty|thirty|forty|fifty|sixty|seventy|eighty| \ 
      ninety|hundred|thousand)" 

print re.search(numbers, text).group(0) 

這給了我第一個字的數字。

我預期的結果= [「一」,「二」,「三」,「10」]

我怎麼可以修改它,使所有文字和好位數字我可以在列表中得到什麼?

+0

使用're.findall'並添加'| [0-9 ] +'分支到你的模式。請參閱https://ideone.com/w9Q0QZ。 'tweo'是一個錯字嗎? –

+0

好吧,這裏還有更多的問題。你也需要使用我相信的詞語界限,因爲你主要對整個詞感興趣。 –

+0

爲什麼你會在'10'上找到一個匹配? – ClasG

回答

2

這裏有幾個問題:

  • 模式應與詳細標誌使用(在開始添加(?x)
  • nine將在ninety匹配nine,所以您應該把更長值首先或使用字邊界\b
  • 聲明與原始字符串文字模式,以避免像解析\b作爲退格而不是字邊界
  • 要匹配數字,你可以添加一個|\d+分支到你的電話號碼匹配組
  • 匹配輸入字符串中的子串的多個非重疊發生,你需要使用re.findall(或re.finditer),不re.search

這裏是我的建議:

import re 
text = 'one two three 10 number eleven eighteen ninety \n ' 
numbers = r"""(?x)   # Turn on free spacing mode 
      (
       ^a(?=\s)|  # Here we match a at the start of string before whitespace 
       \d+|   # HERE we match one or more digits 
       \b   # Initial word boundary 
       (?: 
        one|two|three|four|five|six|seven|eight|nine|ten| 
        eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen| 
        eighteen|nineteen|twenty|thirty|forty|fifty|sixty|seventy|eighty| 
        ninety|hundred|thousand 
      )    # A list of alternatives 
       \b   # Trailing word boundary 
)""" 

print(re.findall(numbers, text)) 

Python demo

這裏是一個regex demo

1

那麼re.findall和[0-9] +的添加對你的清單很好。不幸的是,如果你嘗試匹配像seventythree你會得到 - >七三,所以你需要的東西比這更好的下方:-)

numbers = "(^a(?=\s)|one|two|three|four|five|six|seven|eight|nine|ten| \ 
      eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen| \ 
      eighteen|nineteen|twenty|thirty|forty|fifty|sixty|seventy|eighty| \ 
      ninety|hundred|thousand|[0-9]+)" 

x = re.findall(numbers, text) 
+0

不僅「七十三」,這個不符合「十八」,「十一」,「九十」。當它發現「十六」時,它只會獲取「六」。看到https://ideone.com/jBOsxt –

+0

正確...這是我試圖指出:-)你看起來更好,但它想要匹配七十三。不是嗎?無論如何,有一點加上你...因爲它確實是一段有用的代碼! :-) –

+0

如果OP詢問匹配'七十三',我會看到它。現在,有足夠的問題擔心:) –