将视觉上相同的 python 字符串中的有问题的字符替换为其标准等效字符

Replacing problematic character(s) in visually identical python strings with their standard equivalents

我试图在 Python 3.7.

中包含特定 words/patterns 的数据框列中找到字符串

在此示例中,我要查找包含月份名称或任何年份(从 2016 年到 2030 年)名称的任何字符串

我正在这样做(我确信有更好的方法来做到这一点,尽管现在这就是我正在做的):

years = ['2016', '2017', '2018', '2019', '2020', '2021', '2022', '2023', '2024', '2025', '2026', '2027', '2028', '2029', '2030']

months = ['January', 'january', 'February', 'february', 'March', 'march', 'April', 'april', 'May', 'may', 'June', 'june', 'July', 'july', 'August', 'august', 'September', 'september', 'October', 'october', 'November', 'november', 'December', 'december']

hasDate = df.loc[:, 'text'].apply(lambda x: x.split('?')[0].split('. ')[-1]).str.contains('|'.join(years+months))

这按预期工作,大多数行在 'text' 列中包含年份或月份 return 'True'。 (拆分操作针对字符串中包含的特定句子进行磨练)

但是,在某些情况下,文本字符串明显包含月份名称,但 'False' 是 returned。

示例:

>>> df.loc[133, 'text']
'May 3'

returns False after the above operation.

>>> string = df.loc[133, 'text']
>>> string == 'May 3'
False

当我 copy/paste 将 'string' 的文本输出到 IntelliJ 的 python 终端时,它注意到单词 'May' 拼写错误。

在寻找确定两个字符串之间精确差异的方法后,我尝试了以下操作:

>>> ascii('May 3')
"'May 3'"

>>> ascii(string)
"'M\u0430y 3'"

很明显,字符串中包含的 'a' 字符存在一些问题,导致它与 'May'

不匹配

虽然我已经阅读了从字符串中去除这些有问题的字符的方法,但我不太清楚如何将这个和其他有问题的字符串转换为它们的标准等价物。如果存在类似的现有问题,我提前道歉,但我无法找到针对此特定问题的有效解决方案。

这些字符串来自消息传递应用程序的 API,其中每条消息都是独立的 'object',原始文本是通过 msg.raw_text 提取的。我遍历每条消息并将原始文本附加到数据框列 (df['text']),我希望这是有机会拦截这些有问题的字符的地方,尽管我不太确定如何解决这个问题将原始 'M\u0430y 3' 作为要搜索的项目之一。

非常感谢任何帮助!

感谢 garlon4 who pointed me in the right direction, I was able to solve this issue using the Unidecode package 的帮助。

>>> ascii('May 3')
"'May 3'"

>>> ascii(string)
"'M\u0430y 3'"

>>> from unidecode import unidecode
>>> ascii(unidecode(string))
"'a'"

>>> unidecode(string) == 'May 3'
True