簡體   English   中英

正則表達式匹配字符串中的多個數字

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM