pro*_*eak 5 python regex arabic dataframe pandas
我正在尝试从包含一个字符的单词的数据框中打印出句子,无论它是在句子中间还是结尾的开头,挑战是我的代码非常适合英文脚本,但是当我将脚本更改为阿拉伯语 它打印错误的输出所有句子,而不是包含一个字母的想要的输出。
tdata = pd.read_csv(fileinput, nrows=0).columns[0]
skip = int(tdata.count(' ') == 0)
tdata = pd.read_csv(fileinput, names=['sentences'], skiprows=skip)
df = tdata[dftdata'sentences'].str.contains(r'\b\w{1}\b')]
print(df)
a sample set
-----------------------------
#??? ???? ? ?? ???????
#? ??? ?????? ?????
#?? ??? ???
#??? ??? ??? ???? ?
#??? ??????? ? ?????
#????????? ???? ????
#?? ????? ???? ?? ??? ????? ??? ?????? ?? ???????
#?? ????? ???? ?? ??? ?? ???? ???? ????? ?????? ????? ?? ??????
#?? ????? ???? ?? ??? ?? ???? ???? ???? ??????? ???????
#?? ??????? ???????? ???? ?????? ?? ????? ???? ????? ???? ?
#?????? ???? ????? ????? ? ??????
#???? ?? ????? ?????? (??? ????? ????? ) ??? ?? ???????? ?
# ????? ?
# ????? ?
#?? ?
-----------------------------
expected output
-----------------------------
#??? ???? ? ?? ???????
#? ??? ?????? ?????
#??? ??? ??? ???? ?
#??? ??????? ? ?????
-----------------------------
Run Code Online (Sandbox Code Playgroud)
为什么此代码不适用于与英语相同的阿拉伯文字?
我也试过另一种方法,但没用
tdata.loc[tdaTa.sentences.str.contains(r"([^\w]|^)\w([^\w]|$)")]
Run Code Online (Sandbox Code Playgroud)
我们不能创建一个我们想要的字母数组(?????
试试这个代码:
\n\nimport pandas as pd\n\n# mocking the dataframe based on your sample data\ndf = pd.DataFrame({\'sentences\': [\n \'\xd9\x87\xd9\x84\xd9\x88 \xd9\x83\xd9\x8a\xd9\x81\xd9\x83 \xd9\x85 \xd9\x87\xd9\x8a \xd8\xa7\xd8\xae\xd8\xa8\xd8\xa7\xd8\xb1\xd9\x83\xd9\x85\',\n \'\xd8\xac \xd9\x84\xd9\x8a\xd8\xb4 \xd8\xa7\xd8\xaa\xd8\xa7\xd8\xae\xd8\xb1\xd8\xaa \xd8\xa7\xd9\x84\xd9\x8a\xd9\x88\xd9\x85\',\n \'\xd9\x87\xd9\x88 \xd9\x83\xd9\x84\xd8\xb4 \xd9\x86\xd8\xb0\xd9\x84\',\n \'\xd8\xaa\xd8\xb1\xd8\xa7 \xd8\xa7\xd9\x86\xd9\x8a \xd9\x83\xd9\x84\xd8\xb4 \xd8\xad\xd8\xa8\xd8\xa7\xd8\xa8 \xd8\xb0\',\n \'\xd8\xa8\xd8\xa7\xd8\xa8 \xd8\xa7\xd9\x84\xd9\x85\xd8\xaf\xd8\xb1\xd8\xb3\xd8\xa9 \xd8\xa8 \xd9\x85\xd9\x81\xd8\xaa\xd9\x88\xd8\xad\',\n \'\xd8\xa7\xd9\x84\xd8\xad\xd9\x85\xd8\xaf\xd8\xa7\xd9\x84\xd9\x84\xd9\x87 \xd8\xa7\xd9\x84\xd9\x83\xd9\x84 \xd8\xa8\xd8\xae\xd9\x8a\xd8\xb1\',\n \'\xd9\x83\xd9\x85 \xd9\x86\xd9\x8e\xd8\xad\xd9\x86\xd9\x8f \xd9\x83\xd8\xa8\xd8\xa7\xd8\xb1 \xd9\x85\xd8\xb9 \xd9\x87\xd8\xb0\xd8\xa7 \xd9\x86\xd8\xb9\xd8\xaa\xd9\x85\xd8\xaf \xd8\xb9\xd9\x84\xd9\x89 \xd9\x88\xd8\xa7\xd9\x84\xd8\xaf\xd9\x86\xd8\xa7 \xd9\x81\xd9\x8a \xd9\x85\xd8\xb5\xd8\xb1\xd9\x88\xd9\x81\xd9\x86\xd8\xa7\',\n \'\xd9\x83\xd9\x85 \xd9\x86\xd9\x8e\xd8\xad\xd9\x86\xd9\x8f \xd9\x83\xd8\xa8\xd8\xa7\xd8\xb1 \xd9\x85\xd8\xb9 \xd9\x87\xd8\xb0\xd8\xa7 \xd9\x84\xd8\xa7 \xd8\xaa\xd8\xb9\xd8\xb1\xd9\x81 \xd9\x83\xd9\x8a\xd9\x81\xd9\x8e \xd9\x86\xd8\xaa\xd8\xad\xd8\xaf\xd8\xab \xd8\xa8\xd8\xb7\xd8\xb1\xd9\x8a\xd9\x82\xd8\xa9 \xd9\x84\xd8\xa7\xd8\xa6\xd9\x82\xd8\xa9 \xd9\x81\xd9\x8a \xd8\xa7\xd9\x84\xd9\x85\xd8\xac\xd9\x84\xd8\xb3\',\n \'\xd9\x83\xd9\x85 \xd9\x86\xd9\x8e\xd8\xad\xd9\x86\xd9\x8f \xd9\x83\xd8\xa8\xd8\xa7\xd8\xb1 \xd9\x85\xd8\xb9 \xd9\x87\xd8\xb0\xd8\xa7 \xd9\x84\xd8\xa7 \xd9\x86\xd8\xb9\xd8\xb1\xd9\x81 \xd9\x83\xd9\x8a\xd9\x81\xd9\x8e \xd9\x86\xd8\xb9\xd8\xa8\xd8\xb1 \xd8\xa7\xd9\x84\xd8\xb4\xd8\xa7\xd8\xb1\xd9\x90\xd8\xb9 \xd8\xa8\xd9\x85\xd9\x81\xd8\xb1\xd8\xaf\xd9\x86\xd8\xa7\',\n \'\xd9\x84\xd9\x90\xd9\x85\xd9\x8e \xd9\x84\xd8\xa7 \xd8\xaa\xd8\xac\xd9\x81\xd9\x81\xd9\x86 \xd9\x85\xd8\xb3\xd8\xaa\xd8\xad\xd8\xb6\xd8\xb1 (\xd8\xb7\xd9\x8a\xd9\x86 \xd8\xa7\xd9\x84\xd8\xa8\xd8\xad\xd8\xb1 \xd8\xa7\xd9\x84\xd9\x85\xd9\x8a\xd8\xaa ) \xd9\x82\xd8\xa8\xd9\x84 \xd8\xa3\xd9\x86 \xd8\xaa\xd8\xb3\xd8\xaa\xd8\xae\xd8\xaf\xd9\x85\xd9\x86\xd9\x87\'\n]})\n\n# selecting sentences with a single Arabic character word using regex\npattern = \'(?<![\\u0600-\\u06ff])[\\u0600-\\u06ff](?![\\u0600-\\u06ff])\'\ndf = df[df[\'sentences\'].str.contains(pattern)]\n\nprint(df)\n# sentences\n# 0 \xd9\x87\xd9\x84\xd9\x88 \xd9\x83\xd9\x8a\xd9\x81\xd9\x83 \xd9\x85 \xd9\x87\xd9\x8a \xd8\xa7\xd8\xae\xd8\xa8\xd8\xa7\xd8\xb1\xd9\x83\xd9\x85\n# 1 \xd8\xac \xd9\x84\xd9\x8a\xd8\xb4 \xd8\xa7\xd8\xaa\xd8\xa7\xd8\xae\xd8\xb1\xd8\xaa \xd8\xa7\xd9\x84\xd9\x8a\xd9\x88\xd9\x85\n# 3 \xd8\xaa\xd8\xb1\xd8\xa7 \xd8\xa7\xd9\x86\xd9\x8a \xd9\x83\xd9\x84\xd8\xb4 \xd8\xad\xd8\xa8\xd8\xa7\xd8\xa8 \xd8\xb0\n# 4 \xd8\xa8\xd8\xa7\xd8\xa8 \xd8\xa7\xd9\x84\xd9\x85\xd8\xaf\xd8\xb1\xd8\xb3\xd8\xa9 \xd8\xa8 \xd9\x85\xd9\x81\xd8\xaa\xd9\x88\xd8\xad\nRun Code Online (Sandbox Code Playgroud)\n\n正则表达式解释:
\n\npattern = \'(?<![\\u0600-\\u06ff])[\\u0600-\\u06ff](?![\\u0600-\\u06ff])\'\nRun Code Online (Sandbox Code Playgroud)\n\n[\\u0600-\\u06ff]涵盖标准阿拉伯语unicode 范围,包括字母、数字和变音符号。使用负向后查找(?<![\\u0600-\\u06ff])和负向前查找,(?![\\u0600-\\u06ff])我们将匹配限制为任何单个阿拉伯字符,该字符之前或之后都没有另一个阿拉伯字符。
如果您想要匹配特定的字符集而不是全部,请将中间更改[\\u0600-\\u06ff]为您想要的任何字符集。例如,如果您只想匹配从 0 到 9 的阿拉伯数字,则使用[\\u0660-\\u0669]:
pattern = \'(?<![\\u0600-\\u06ff])[\\u0660-\\u0669](?![\\u0600-\\u06ff])\'\nRun Code Online (Sandbox Code Playgroud)\n\n对于英语,整个模式应该是这样的:
\n\npattern = \'\\b\\w\\b\'\nRun Code Online (Sandbox Code Playgroud)\n