问题描述
我有一个波斯文本文件,里面有一些像这样的行:
ذوب 6 خوی 7 بزاق ،آبدهان ، یم 10 زهاب، 11 آبرو، حیثیت، شرف
我想从这一行生成一个单词列表.对我来说,单词边框是数字,如上一行中的 6、7 等,还有 ،
字符.所以列表应该是:
[ 'ذوب','خوی','بزاق','آبدهان','یم','زهاب','آبرو','حیثیت','شرف']
我想在 Python 3.3 中做到这一点.这样做的最佳方法是什么,我非常感谢您对此提供的帮助.
我得到了很多答案,但是当我将它们用于另一个测试用例时,它们不起作用.测试用例是这样的:
منهدم کردن : 1 خراب کردن، ویران کردن، تخریب کردن 2 نابود کردن، از بین بردن
我希望有一个这样的令牌列表:
['منهدم کردن', 'خراب کردن', 'ویران کردن', 'تخریب کردن', 'نابود کردن', 'از بدین] بن
使用 regex
包:
- 文本包含零宽度非连接器 (U+200C).使用
str.replace
删除字符. \p{L}
或\p{Letter}
匹配来自任何语言的任何类型的字母.
更新
要同时包含 U+200C,请使用 [\p{Cf}\p{L}]+
代替(\p{Cf}
或 \p{Format}
匹配不可见的格式化字符):
它看起来与您想要的不同,但它们是相同的:
>>>got = regex.findall(r'[\p{Cf}\p{L}]+', 文本)>>>想要 = [ 'ذوب','خوی','بزاق','آبدهان','یم','زهاب','آبرو','حیثیت','شرف']>>>打印(想要)['ذوب', 'خوی', 'بزاق', 'آب\u200cدهان', 'یم', 'زهاب', 'آبرو', 'حیثیت', 'شرف']>>>得到 == 想要>>>得到[:3]['ذوب', 'خوی', 'بزاق']>>>得到[4:]['یم', 'زهاب', 'آبرو', 'حیثیت', 'شرف']更新2
编辑过的问题中的某些单词包含空格.
>>>' ' in 'منهدم کردن'真的我在下面的代码中添加了 \s
以匹配空格,然后从匹配的字符串中去除前导和尾随空格,然后过滤掉空字符串.
I have a Persian text file that has some lines like this:
ذوب 6 خوی 7 بزاق ،آبدهان ، یم 10 زهاب، 11 آبرو، حیثیت، شرف
I want to generate a list of words from this line. For me the word borders are numbers, like 6, 7, etc in the above line and also ،
character.so the list should be:
[ 'ذوب','خوی','بزاق','آبدهان','یم','زهاب','آبرو','حیثیت' ,'شرف']
I want to do this in Python 3.3.What is the best way of doing this, I really appreciate any help on this.
EDIT:
I got a number of answers but when I used them for another test case they didn't work. The test case is this:
منهدم کردن : 1 خراب کردن، ویران کردن، تخریب کردن 2 نابود کردن، از بین بردن
and I expect to have a list of tokens as this:
['منهدم کردن','خراب کردن', 'ویران کردن', 'تخریب کردن','نابود کردن', 'از بین بردن']
Using regex
package:
>>> import regex
>>> text = 'ذوب 6 خوی 7 بزاق ،آبدهان ، یم 10 زهاب، 11 آبرو، حیثیت، شرف'
>>> regex.findall(r'\p{L}+', text.replace('\u200c', ''))
['ذوب', 'خوی', 'بزاق', 'آبدهان', 'یم', 'زهاب', 'آبرو', 'حیثیت', 'شرف']
- The text contains ZERO WIDTH NON-JOINER (U+200C). removed the character using
str.replace
. \p{L}
or\p{Letter}
matches any kind of letter from any language.
See Regex Tutorial - Unicode Characters and Properties.
UPDATE
To also include U+200C, use [\p{Cf}\p{L}]+
instead (\p{Cf}
or \p{Format}
matches invisible formatting character):
>>> regex.findall(r'[\p{Cf}\p{L}]+', text)
['ذوب', 'خوی', 'بزاق', 'آب\u200cدهان', 'یم', 'زهاب', 'آبرو', 'حیثیت', 'شرف']
It looks diffent from what you want, but they are equal:
>>> got = regex.findall(r'[\p{Cf}\p{L}]+', text)
>>> want = [ 'ذوب','خوی','بزاق','آبدهان','یم','زهاب','آبرو','حیثیت' ,'شرف']
>>> print(want)
['ذوب', 'خوی', 'بزاق', 'آب\u200cدهان', 'یم', 'زهاب', 'آبرو', 'حیثیت', 'شرف']
>>> got == want
>>> got[:3]
['ذوب', 'خوی', 'بزاق']
>>> got[4:]
['یم', 'زهاب', 'آبرو', 'حیثیت', 'شرف']
UPDATE2
Some words in the edited question contains a space.
>>> ' ' in 'منهدم کردن'
True
I added \s
in the following code to also match the spaces, then strip the leading, trailing spaces from the matched strings, then filtered out empty strings.
>>> text = 'منهدم کردن : 1 خراب کردن، ویران کردن، تخریب کردن 2 نابود کردن، از بین بردن'
>>> want = ['منهدم کردن','خراب کردن', 'ویران کردن', 'تخریب کردن','نابود کردن', 'از بین بردن']
>>> [x for x in map(str.strip, regex.findall(r'[\p{Cf}\p{L}\s]+', text)) if x] == want
True
这篇关于在 Python 中标记非英文文本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!