我有一個看起來像這樣的正則運算式來從列中提取訂單號:
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
我怎樣才能得到我正在尋找的結果?
uj5u.com熱心網友回復:
您可以使用
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])- 匹配可選的/,, 空格,#,_,;,.或-char,然后匹配無或未包含其他數字的十位數字Series.str.findall提取所有事件.str.join('')將匹配項連接成一個字串.str.lstrip('/ #_;.-')- 洗掉與字串開頭的數字匹配的特殊字符df.loc[df['Result'] == '', 'Result'] = np.nannp.nan- 如果需要 - 用列中的值替換空字串Result。
輸出:
>>> 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
>>>
uj5u.com熱心網友回復:
您可以調整下一個代碼以使用資料框,
正則運算式:(?:^|([/ #_;.-]))(?:\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
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/475184.html
上一篇:替換雙大括號正則運算式內的字符
下一篇:在大寫單詞上拆分字串
