我已经问过一个关于替换特定模式的正则表达式问题(正则表达式:匹配特定模式,如果匹配在特定上下文中,则排除)。这一切都是为了对文本数据进行预处理以进行训练。现在我想使用正则表达式来替换熊猫数据框中除 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: 25m²", "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: 25m²", "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}
此处的字符列表。
慕森王
TA贡献1777条经验 获得超3个赞
这应该适合你:
import regex
import pandas as pd
df = pd.DataFrame({"text": ["Room: 25m²", "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
添加回答
举报
0/150
提交
取消