繁体   English   中英

正则表达式:匹配除了unicode字母之外的所有内容

[英]Regex: Match everything except unicode letters

我已经问过有关替换特定模式的正则表达式问题(正则表达式:匹配特定模式,如果匹配是在特定上下文中,则排除 )。 这一切都是为了预处理训练的文本数据而完成的。

现在我想使用正则表达式来替换pandas数据框中除了unicode字母之外的任何东西。 我用过

得到正则表达式似乎解决了我的问题\\p{^L}+ 后来我意识到我已经找到了在Perl(Perl Compatible Regular Expressions [PCRE])中运行的表达式,不一定在Python中。 我找到了支持这个表达式的正则表达式包 但是,熊猫似乎还没有支持正则表达式,或者我用错了方法:

import regex
import pandas as pd
df = 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 re
import pandas as pd
df = pd.DataFrame({"text": ["Room: 25m²", "I have eaten ¼ of the cake."]})
df["text"] = df["text"].str.replace("[\W\d_]", " ")

它确实取代了很多特殊字符。 它不会将m的表达式替换为2的幂或具有分数的表达式。 两个字符,我不会看到字母,而是unicode中的数字或特殊字符。 那么我该如何处理这些特殊字符呢? 重新包装有可能吗? 我不想使用特定的unicodes来匹配这些情况。 如果可能的话,我们将不胜感激。

[\\W\\d_]是一个正则表达式,匹配任何非单词char(任何不匹配\\w字符),它匹配数字与\\d_ 请注意,Unicode识别Python 3正则表达式中的\\d仅匹配\\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}字符列表

这应该适合你:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM