【发布时间】:2018-08-13 18:36:22
【问题描述】:
我正在尝试在包含 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 提取的。我遍历每条消息并将原始文本附加到数据框列(df ['text']),我希望这是有机会拦截这些有问题的字符的地方,尽管我不太确定如何从包括原始的“M\u0430y 3”作为要搜索的项目之一。
非常感谢任何帮助!
【问题讨论】:
-
您的示例使用的是西里尔字母“a”而不是拉丁语“a”。在比较之前没有音译您的输入,我不确定您将如何理解这一点。没用过,不过貌似有个pypi包可以音译。
-
感谢您的回复,这确实很奇怪,因为文本本身是英文的。如果我找到解决方案,我会研究音译包并更新!
-
感谢 @garlon4 为我指明正确的方向 - 我能够使用 Unidecode 包解决我的问题。
标签: python string python-3.x ascii non-ascii-characters