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

时间:2018-08-13 18:36:22

标签: python string python-3.x ascii non-ascii-characters

我正在尝试在数据框列中查找包含Python 3.7中特定单词/样式的字符串。

在此示例中,我正在寻找包含月份或年份(从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))

这可以按预期工作,并且大多数在“文本”列中包含字符串的行(包含年份或月份)都返回“真”。 (拆分操作针对字符串中包含的特定句子进行磨练)

但是,在某些情况下,文本字符串明显包含一个月的名称,但返回了'False'。

示例:

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

returns False after the above operation.

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

当我将'string'的文本输出复制/粘贴到IntelliJ的python终端中时,它会注意到'May'这个单词拼写错误。

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

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

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

很明显,字符串中的'a'字符存在一些问题,导致其与'May'不匹配

虽然我已经阅读了有关从字符串中剥离这些有问题的字符的方法,但我还不太清楚如何将其以及其他有问题的字符串转换为它们的标准等效字符。如果仍然存在类似的现有问题,我事先表示歉意,尽管我找不到能够解决该特定问题的解决方案。

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

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

感谢garlon4的帮助,他指出了正确的方向,因此我能够使用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