亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

正則表達式:匹配除 Unicode 字母以外的所有內容

正則表達式:匹配除 Unicode 字母以外的所有內容

翻閱古今 2021-06-11 19:42:06
我已經問過一個關于替換特定模式的正則表達式問題(正則表達式:匹配特定模式,如果匹配在特定上下文中,則排除)。這一切都是為了對文本數據進行預處理以進行訓練?,F在我想使用正則表達式來替換熊貓數據框中除 unicode 字母以外的任何內容。我用過https://regex101.com/https://regexr.com/得到似乎解決我的問題的正則表達式\p{^L}+。后來我意識到我發現在 Perl 中使用的表達式(Perl Compatible Regular Expressions [PCRE])不一定適用于 Python。我也找到了支持這個表達式的正則表達式包。但是,pandas 似乎還不支持正則表達式,或者我以錯誤的方式使用了它:import regeximport pandas as pddf = pd.DataFrame({"text": ["Room: 25m2", "I have eaten ? of the cake."]})df["text"] = df["text"].str.replace(regex.compile("\p{^L}+"), " ")# Returns a TypeError: object of type '_regex.Pattern' has no len()因此,我試圖找到使用 re 包的方法。我在這里找到了答案。所以我是這樣使用的:import reimport pandas as pddf = pd.DataFrame({"text": ["Room: 25m2", "I have eaten ? of the cake."]})df["text"] = df["text"].str.replace("[\W\d_]", " ")它確實替換了很多特殊字符。它不會用 m 的 2 次冪替換表達式或我們有分數的表達式。我不會將這兩個字符視為字母,而是數字或 unicode 中的特殊字符。那么我該如何處理這些特殊字符呢?re包可以嗎?我不想使用特定的 unicode 來匹配這些情況。如果可能,將不勝感激通用解決方案。
查看完整描述

2 回答

?
忽然笑

TA貢獻1806條經驗 獲得超5個贊

[\W\d_]是符合任何非字字符(不與任何匹配字符正則表達式\w),它匹配位數與\d和一個_。請注意,\d在支持 Unicode 的Python 3 正則表達式中,僅匹配\p{Nd}(數字、十進制):

匹配任何 Unicode 十進制數字(即 Unicode 字符類別中的任何字符[Nd])。

此模式不會在您的字符串中刪除的字符屬于\p{No}Unicode 類別(數字、其他)。

因此,如果您還打算從 中刪除所有這些字符\p{No},則需要將它們添加到模式中:

r'[\u00B2\u00B3\u00B9\u00BC-\u00BE\u09F4-\u09F9\u0B72-\u0B77\u0BF0-\u0BF2\u0C78-\u0C7E\u0D58-\u0D5E\u0D70-\u0D78\u0F2A-\u0F33\u1369-\u137C\u17F0-\u17F9\u19DA\u2070\u2074-\u2079\u2080-\u2089\u2150-\u215F\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2CFD\u3192-\u3195\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\uA830-\uA835\U00010107-\U00010133\U00010175-\U00010178\U0001018A\U0001018B\U000102E1-\U000102FB\U00010320-\U00010323\U00010858-\U0001085F\U00010879-\U0001087F\U000108A7-\U000108AF\U000108FB-\U000108FF\U00010916-\U0001091B\U000109BC\U000109BD\U000109C0-\U000109CF\U000109D2-\U000109FF\U00010A40-\U00010A47\U00010A7D\U00010A7E\U00010A9D-\U00010A9F\U00010AEB-\U00010AEF\U00010B58-\U00010B5F\U00010B78-\U00010B7F\U00010BA9-\U00010BAF\U00010CFA-\U00010CFF\U00010E60-\U00010E7E\U00011052-\U00011065\U000111E1-\U000111F4\U0001173A\U0001173B\U000118EA-\U000118F2\U00011C5A-\U00011C6C\U00016B5B-\U00016B61\U0001D360-\U0001D371\U0001E8C7-\U0001E8CF\U0001F100-\U0001F10C\W\d_]+'

請參閱正則表達式演示。

另外,請注意數字、字母類別,請參閱\p{Nl}此處字符列表。


查看完整回答
反對 回復 2021-06-15
?
慕森王

TA貢獻1777條經驗 獲得超3個贊

這應該適合你:


import regex

import pandas as pd

df = pd.DataFrame({"text": ["Room: 25m2", "I have eaten ? of the cake."]})



regex_pat = re.compile(r"[^a-zA-Z\s]")

df["text"] = df["text"].str.replace(regex_pat, "")

輸出:


0                       Room m

1    I have eaten  of the cake

Name: text, dtype: object


查看完整回答
反對 回復 2021-06-15
  • 2 回答
  • 0 關注
  • 430 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號