[英]Regex to match multiple numbers within string
我有一個看起來像這樣的正則表達式來從列中提取訂單號:
df["Orders"].str.extract('([0-9]{9,10}[/+ #_;.-]?)')
訂單列可能如下所示:
12
123456789
1234567890
123456789/1234567890
123456789/1/123456789
123456789+1234567890
正則表達式后數據框中生成的新列應如下所示:
NaN
123456789
1234567890
123456789/1234567890
123456789/123456789
123456789+1234567890
但是,使用我當前的正則表達式,我得到以下結果:
NaN
123456789
1234567890
123456789/
123456789/
123456789+
我怎樣才能得到我正在尋找的結果?
您可以使用
import pandas as pd
df = pd.DataFrame({'Orders':['12','123456789','1234567890','123456789/1234567890','123456789/1/123456789','123456789+1234567890', 'Order number: 6508955960_000010_1005500']})
df["Result"] = df["Orders"].str.findall(r'[/+ #_;.-]?(?<![0-9])[0-9]{9,10}(?![0-9])').str.join('').str.lstrip('/+ #_;.-')
df.loc[df['Result'] == '', 'Result'] = np.nan
請參閱正則表達式演示。 細節
[/+ #_;.-]?(?<![0-9])[0-9]{9,10}(?![0-9])
- 匹配可選的/
、 +
、空格、 #
, _
, ;
, .
或-
字符,然后是不包含其他數字的無或十位數字Series.str.findall
提取所有出現.str.join('')
將匹配項連接成一個字符串.str.lstrip('/+ #_;.-')
- 刪除與字符串開頭的數字匹配的特殊字符df.loc[df['Result'] == '', 'Result'] = np.nan
- 如果需要 - 用Result
列中的np.nan
值替換空字符串。輸出:
>>> df
Orders Result
0 NaN NaN
1 123456789 123456789
2 1234567890 1234567890
3 123456789/1234567890 123456789/1234567890
4 123456789/1/123456789 123456789/123456789
5 123456789+1234567890 123456789+1234567890
>>>
您可以調整下一個代碼以使用數據框,
正則表達式: (?:^|([/+ #_;.-]))(?:\d{1,8})(?!\d)
(?:\d{1,8})(?!\d)
- 找到一個數字(<9 位)([/+ #_;.-])
- 前面有一個/沒有一個可能的分隔符(組 #1) 有條件地替換為NaN
或空字符串 - subst
使用match.group(1)
來區分兩個選項:
12
/1
import re
regex = r"(?:^|([/+ #_;.-]))(?:\d{1,8})(?!\d)"
test_str = ("12\n"
"123456789\n"
"1234567890\n"
"123456789/1234567890\n"
"123456789/1/123456789\n"
"123456789+1234567890")
def subst(match):
m = match.group(1)
return "" if m else "NaN"
result = re.sub(regex, subst, test_str, 0, re.MULTILINE)
if result:
print(result)
輸出:
NaN
123456789
1234567890
123456789/1234567890
123456789/123456789
123456789+1234567890
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.