<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr">Well, that's exactly what I meant when asking for a bit of context.</div><div dir="ltr">As somebody not knowing anything about arabic languages, to me the last character in "قَالَ" is "لَ", as "لَ" is treated as a complete character when moving around or selecting with the cursor; my answer worked because nobody told me about that.</div><div dir="ltr">The fatha, as I understand, is a diacritic glyph, but in most western languages those glyphs are always part of another letter, so "à" is always a single character in unicode (even if "`" exists as a single character alone).</div><div>For example, u'à' is u'\xe0' for python 2 and for python 3 it is b'\xc3\xa0', which is a single character len as 'a' without any accent, while u'لَ' is u'\u0644\u064e' and b'\xd9\x84\xd9\x8e' respectively. You can easily do a len() to see that. Unfortunally, character selection and cursor position treat 'لَ' as a single one just like 'à', hence the misunderstanding. I assume that's a similar behavior with how japanese kanji characters are treated.</div><div><br></div><div>So, the problem here is that, since those glyphs are treated as single separated characters for "strings", you'll need a bit more complex and stronger regex - and that's where you'll need to better understand how regexes work, since they were created mostly for western languages, and their usage with extended languages (and then unicode) requires a deeper knowledge.<br><br></div><div>When I tried your example I tested the regex alone before, and the results were confirmed, so I assumed it was ok.</div><div>You probably need to add a further step to better understand what's not working: the first is to be completely sure that the expression you use actually matches what you want. You can just print to console the results (with character positions and so on) or anything you want, _then_ test the result to the QTextDocument and see, by iterating the results carefully, how the QTextCursor is behaving. If you still don't understand what's going on then, that's where you send here that code with the forementioned context. We're eager to help, but we can't do everything :-)<br></div><div>And there's the possibility that, while doing so, you'll find what is wrong; it's called "Rubber duck debugging", and it's when you have to explain almost line-by-line, your code and your case, possibly to somebody who knows absolutely anything about it. I solved tons of problems by starting to ask a question and writing example code, and finding the solution myself even before finishing the question because I was forced to think about the problem and explain it in a "different" and thorough way.</div><div><br>Anyway, I wasn't saying you should never ask those things, but that you probably should ask somewhere else, some forum/website/list where you would probably find more people who is actually able to give you an answer, and for that stackoverflow might be much more helpful. About that, have a look at this: <a href="https://stackoverflow.com/questions/11323596/regular-expression-for-arabic-language">https://stackoverflow.com/questions/11323596/regular-expression-for-arabic-language</a> Knowing the unicode blocks could be helpful to better track word boundaries in expressions.</div><div><br></div><div><br>I understand that documentation about these topics is not common or easy to find as in other languages, but I'm also pretty sure you're not the first having these kind of issues, so, the trick is to be patient and ask in/look for the right places :-)<br>If you need to test your expressions, you can also use <a href="http://regex101.com">regex101.com</a>, which features a very good interface and provides deep insights to regular expressions as they are inserted.</div><div><br></div><div>So, I'd suggest you try to simplify your code, make step-by-step tests against your regular expressions and, if everything looks ok but you still have problems with the QTextCursor, then submit us an example with all possible test cases _already included_ in the code, and I'd be happy to help if I can.<br><br>Good luck!<br>Maurizio</div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">2018-09-02 10:12 GMT+02:00 Maziar Parsijani <span dir="ltr"><<a href="mailto:maziar.parsijani@gmail.com" target="_blank">maziar.parsijani@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div><span style="font-family:times new roman,serif">Hi Maurizio and David<br></span></div><div><span style="font-family:times new roman,serif">You both are correct ,but if you attract on the code :When you copy the last character in "<font size="6"><span style="color:rgb(0,0,255)">قَالَ <font size="2">" <font color="#000000">we call it fatha " </font></font></span></font><font size="6"><span style="color:rgb(0,0,255)">ــَ <font size="2"><font color="#000000">" and put it completely in the lineedit.text() then it will find it correctly without (</font></font></span></font><font size="6"><span style="color:rgb(0,0,255)"><font size="2"><font color="#000000">r'\b{}\b').<br></font></font></span></font></span></div><div><span style="font-family:times new roman,serif"><font size="6"><span style="color:rgb(0,0,255)"><font size="2"><font color="#000000">The problem here is with that last one character which is sometimes different for example if I change the string to this :<br></font></font></span></font><br><font size="6"><span style="color:rgb(0,0,255)"><font size="2"><font color="#000000">m = "<span style="color:rgb(0,128,128);font-weight:bold">قَالَتْ  قَالَ فَقَالُو</span><span style="color:rgb(0,128,128);font-weight:bold">ا۟</span><span style="color:rgb(0,128,128);font-weight:bold"> قَالُو</span><span style="color:rgb(0,128,128);font-weight:bold">ا۟</span><span style="color:rgb(0,128,128);font-weight:bold"> قَالَ  قَالُوٓ</span><span style="color:rgb(0,128,128);font-weight:bold">ا۟</span><span style="color:rgb(0,128,128);font-weight:bold"> قَالَتَا  </span><span style="color:rgb(0,128,128);font-weight:bold">ٱ</span><span style="color:rgb(0,128,128);font-weight:bold">لْقَالِينَ</span> </font></font></span></font><font size="6"><span style="color:rgb(0,0,255)"><font size="2"><font color="#000000"><font size="6"><span style="color:rgb(0,0,255)"><font size="2"><font color="#000000"><span style="color:rgb(0,128,128);font-weight:bold"> قَال<font color="#000000"> </font></span></font></font></span></font></font></font></span></font><font size="6"><span style="color:rgb(0,0,255)"><font size="2"><font color="#000000"><font size="6"><span style="color:rgb(0,0,255)"><font size="2"><font color="#000000"><span style="color:rgb(0,128,128);font-weight:bold"><font color="#000000"><font size="6"><span style="color:rgb(0,0,255)"><font size="2"><font color="#000000"><span style="color:rgb(0,128,128);font-weight:bold"> قَال<font color="#000000">ِ</font></span></font></font></span></font></font></span></font></font></span></font></font></font></span> "<br></font></span></div><div><span style="font-family:times new roman,serif"><font size="6"><span style="color:rgb(0,0,255)"><font size="2"><font color="#000000">then we can not use </font></font></span></font><font size="6"><span style="color:rgb(0,0,255)"><font size="2"><font color="#000000"><font size="6"><span style="color:rgb(0,0,255)"><font size="2"><font color="#000000">(</font></font></span></font><font size="6"><span style="color:rgb(0,0,255)"><font size="2"><font color="#000000">r'\b{}\b').<br></font></font></span></font></font></font></span></font></span></div><div><span style="font-family:times new roman,serif"><font size="6"><span style="color:rgb(0,0,255)"><font size="2"><font color="#000000"><font size="6"><span style="color:rgb(0,0,255)"><font size="2"><font color="#000000">Dear </font></font></span></font></font></font></span></font></span><span style="font-family:times new roman,serif"> Maurizio I will take your advice But the problem here maybe related to PYQT.QTGUI.Qtextcursor and Qtextedit.textcursor <br></span></div><div><span style="font-family:times new roman,serif">if  you say that it is not related then I will not ask anything else .and as you know the Arabic  help texts in python are not so helpful. <br></span></div><div><span style="font-family:times new roman,serif">Thanks anyway but let me know about that I don't try to post other problems like this.<br></span></div><div><pre style="background-color:rgb(255,255,255);color:rgb(0,0,0);font-family:"DejaVu Sans Mono";font-size:9.1pt"><br><span style="font-family:times new roman,serif"></span></pre></div></div></div></div></div></div></div></div></div><div><div class="h5"><br><div class="gmail_quote"><div dir="ltr">On Sun, Sep 2, 2018 at 12:33 AM Maurizio Berti <<a href="mailto:maurizio.berti@gmail.com" target="_blank">maurizio.berti@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div>Simple regexes like that one will match all sequences of characters found; if you want to find those character as a single "word", you will need to use word boundaries.</div><div><br></div><div>Change the pattern init to this and it works (at least, according to the string you gave):<br><br></div><div><font face="monospace, monospace">pattern = QtCore.QRegExp(r'\b{}\b'.<wbr>format(self.lineEdit.text()))</font><br></div><div><br></div><div>Have a look at this, too: <a href="https://stackoverflow.com/questions/40731058/regex-match-arabic-keyword" target="_blank">https://stackoverflow.<wbr>com/questions/40731058/regex-<wbr>match-arabic-keyword</a><br></div><div><br>As a side note, forgive my bluntness, but you might want to read some more documentation about regex and right-to-left languages practices.</div><div>The latest questions you asked were not python nor qt related at all, and, as you might understand, most of the people on this mailing list don't even know how arabic language works; a bit of context might be useful, so that even people not experienced with those language might help too.</div><div><br>Also, try to simplify examples by limiting code to what is really related to your issue: those geometry, font and widget settings won't help anyone reading your code. The same example could have been written in less than half lines, and would have been much more readable: easier to read is easier to understand and easier to help.<br>Finally, avoid mixing the way you import modules. You should import from the main module _OR_ from the submodules. While it doesn't change much in terms of computation, it decreases the possibility of bugs and improves readibility, which is better for everybody reading your code, including you :-)</div><div><br></div><div>Maurizio</div><div><br></div><div><br></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">2018-09-01 20:33 GMT+02:00 Maziar Parsijani <span dir="ltr"><<a href="mailto:maziar.parsijani@gmail.com" target="_blank">maziar.parsijani@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr">I want to select 2 "<span style="color:rgb(0,128,128);font-weight:bold">قَالَ</span>" in m = "<span style="color:rgb(0,128,128);font-weight:bold">قَالَتْ  قَالَ فَقَالُو</span><span style="color:rgb(0,128,128);font-weight:bold;font-family:"Amiri Quran Colored"">ا۟</span><span style="color:rgb(0,128,128);font-weight:bold"> قَالُو</span><span style="color:rgb(0,128,128);font-weight:bold;font-family:"Amiri Quran Colored"">ا۟</span><span style="color:rgb(0,128,128);font-weight:bold"> قَالَ  قَالُوٓ</span><span style="color:rgb(0,128,128);font-weight:bold;font-family:"Amiri Quran Colored"">ا۟</span><span style="color:rgb(0,128,128);font-weight:bold"> قَالَتَا  </span><span style="color:rgb(0,128,128);font-weight:bold;font-family:"Aldhabi"">ٱ</span><span style="color:rgb(0,128,128);font-weight:bold">لْقَالِينَ</span>  " but with the below code it selects all words which contains " "<span style="color:rgb(0,128,128);font-weight:bold">قَالَ</span>"  <br></div><div>Now what is the problem here?<br></div><div>I have to put spaces before and after pattern1 for such thing but it doesn't work for me.<br><pre style="background-color:rgb(255,255,255);color:rgb(0,0,0);font-family:"DejaVu Sans Mono";font-size:9.1pt">pattern1 = <span style="color:rgb(0,128,128);font-weight:bold">" {0} "</span>.format(<span style="color:rgb(148,85,141)">self</span>.lineEdit.text())<span class="m_9072950960043576933gmail-m_-2942892887450796706m_5257909204618472470m_-3820615639630079966m_-5172197483062635484gmail-"> </span></pre></div><div dir="ltr"><span style="color:rgb(0,128,128);font-weight:bold"></span></div><div><span style="color:rgb(0,128,128);font-weight:bold"><br></span></div><div dir="ltr"><pre style="background-color:rgb(255,255,255);color:rgb(0,0,0);font-family:"DejaVu Sans Mono";font-size:9.1pt"><span style="color:rgb(0,0,128);font-weight:bold">from </span>PyQt5 <span style="color:rgb(0,0,128);font-weight:bold">import </span>QtCore, QtGui, QtWidgets<br><span style="color:rgb(0,0,128);font-weight:bold">from </span>PyQt5.QtWidgets <span style="color:rgb(0,0,128);font-weight:bold">import </span>QApplication, QTextEdit<br><span style="color:rgb(0,0,128);font-weight:bold">from </span>PyQt5.QtGui <span style="color:rgb(0,0,128);font-weight:bold">import </span>QTextDocument, QTextDocumentFragment<br><span style="color:rgb(0,0,128);font-weight:bold">from </span>PyQt5 <span style="color:rgb(0,0,128);font-weight:bold">import </span>QtCore, QtGui, QtWidgets<br><span style="color:rgb(0,0,128);font-weight:bold">import </span>sys<br><span style="color:rgb(0,0,128);font-weight:bold">from </span>PyQt5.QtWidgets <span style="color:rgb(0,0,128);font-weight:bold">import </span>QDialog, QApplication<br><span style="color:rgb(0,0,128);font-weight:bold">class </span>AppWindow(QDialog):<br>    <span style="color:rgb(0,0,128);font-weight:bold">def </span><span style="color:rgb(178,0,178)">__init__</span>(<span style="color:rgb(148,85,141)">self</span>):<br>        <span style="color:rgb(0,0,128)">super</span>().<span style="color:rgb(178,0,178)">__init__</span>()<br>        <span style="color:rgb(148,85,141)">self</span>.setObjectName(<span style="color:rgb(0,128,128);font-weight:bold">"Dialog"</span>)<br>        <span style="color:rgb(148,85,141)">self</span>.resize(<span style="color:rgb(0,0,255)">800</span>, <span style="color:rgb(0,0,255)">600</span>)<br>        <span style="color:rgb(148,85,141)">self</span>.lineEdit = QtWidgets.QLineEdit(<span style="color:rgb(148,85,141)">self</span>)<br>        <span style="color:rgb(148,85,141)">self</span>.lineEdit.setGeometry(<wbr>QtCore.QRect(<span style="color:rgb(0,0,255)">70</span>, <span style="color:rgb(0,0,255)">70</span>, <span style="color:rgb(0,0,255)">211</span>, <span style="color:rgb(0,0,255)">21</span>))<br>        <span style="color:rgb(148,85,141)">self</span>.lineEdit.setObjectName(<span style="color:rgb(0,128,128);font-weight:bold">"<wbr>lineEdit"</span>)<br>        <span style="color:rgb(148,85,141)">self</span>.pushButton = QtWidgets.QPushButton(<span style="color:rgb(148,85,141)">self</span>)<br>        <span style="color:rgb(148,85,141)">self</span>.pushButton.setGeometry(<wbr>QtCore.QRect(<span style="color:rgb(0,0,255)">130</span>, <span style="color:rgb(0,0,255)">110</span>, <span style="color:rgb(0,0,255)">83</span>, <span style="color:rgb(0,0,255)">28</span>))<br>        <span style="color:rgb(148,85,141)">self</span>.pushButton.setObjectName(<span style="color:rgb(0,128,128);font-weight:bold"><wbr>"pushButton"</span>)<br>        <span style="color:rgb(148,85,141)">self</span>.SearchResults = QtWidgets.QTextEdit(<span style="color:rgb(148,85,141)">self</span>)<br>        <span style="color:rgb(148,85,141)">self</span>.SearchResults.<wbr>setGeometry(QtCore.QRect(<span style="color:rgb(0,0,255)">130</span>, <span style="color:rgb(0,0,255)">140</span>, <span style="color:rgb(0,0,255)">500</span>, <span style="color:rgb(0,0,255)">400</span>))<br>        font = QtGui.QFont()<br>        font.setFamily(<span style="color:rgb(0,128,128);font-weight:bold">"Amiri"</span>)<br>        font.setPointSize(<span style="color:rgb(0,0,255)">12</span>)<br>        <span style="color:rgb(148,85,141)">self</span>.SearchResults.setFont(<wbr>font)<br>        <span style="color:rgb(148,85,141)">self</span>.SearchResults.<wbr>setToolTipDuration(<span style="color:rgb(0,0,255)">0</span>)<br>        <span style="color:rgb(148,85,141)">self</span>.SearchResults.<wbr>setReadOnly(<span style="color:rgb(0,0,128);font-weight:bold">True</span>)<br>        <span style="color:rgb(148,85,141)">self</span>.SearchResults.<wbr>setAutoFormatting(QtWidgets.<wbr>QTextEdit.AutoAll)<br>        <span style="color:rgb(148,85,141)">self</span>.SearchResults.<wbr>setObjectName(<span style="color:rgb(0,128,128);font-weight:bold">"SearchResults"</span>)<br><br>        <span style="color:rgb(148,85,141)">self</span>.retranslateUi(<span style="color:rgb(148,85,141)">self</span>)<br>        QtCore.QMetaObject.<wbr>connectSlotsByName(<span style="color:rgb(148,85,141)">self</span>)<br>    <span style="color:rgb(0,0,128);font-weight:bold">def </span>find1(<span style="color:rgb(148,85,141)">self</span>):<br>            m = <span style="color:rgb(0,128,128);font-weight:bold">"  قَالَتْ  قَالَ فَقَالُو</span><span style="color:rgb(0,128,128);font-weight:bold;font-family:"Amiri Quran Colored"">ا۟</span><span style="color:rgb(0,128,128);font-weight:bold"> قَالُو</span><span style="color:rgb(0,128,128);font-weight:bold;font-family:"Amiri Quran Colored"">ا۟</span><span style="color:rgb(0,128,128);font-weight:bold"> قَالَ  قَالُوٓ</span><span style="color:rgb(0,128,128);font-weight:bold;font-family:"Amiri Quran Colored"">ا۟</span><span style="color:rgb(0,128,128);font-weight:bold"> قَالَتَا  </span><span style="color:rgb(0,128,128);font-weight:bold;font-family:"Aldhabi"">ٱ</span><span style="color:rgb(0,128,128);font-weight:bold">لْقَالِينَ    "<br></span><span style="color:rgb(0,128,128);font-weight:bold">            </span><span style="color:rgb(148,85,141)">self</span>.SearchResults.append(<span style="color:rgb(0,128,128);font-weight:bold">'{0} '</span>.format(m))<br><br><br>            cursor = <span style="color:rgb(148,85,141)">self</span>.SearchResults.textCursor(<wbr>)<br>            format = QtGui.QTextCharFormat()<br>            format.setForeground(QtGui.<wbr>QBrush(QtGui.QColor(<span style="color:rgb(0,128,128);font-weight:bold">"red"</span>)))<br><br>            pattern1 = <span style="color:rgb(0,128,128);font-weight:bold">"{0}"</span>.format(<span style="color:rgb(148,85,141)">self</span>.lineEdit.<wbr>text())<br>            regex = QtCore.QRegExp(pattern1)<br>            pos = <span style="color:rgb(0,0,255)">0<br></span><span style="color:rgb(0,0,255)">            </span>index = regex.indexIn(<span style="color:rgb(148,85,141)">self</span>.<wbr>SearchResults.toPlainText(), pos)<br>            tedad = <span style="color:rgb(0,0,255)">0<br></span><span style="color:rgb(0,0,255)">            </span><span style="color:rgb(0,0,128);font-weight:bold">while </span>(index != -<span style="color:rgb(0,0,255)">1</span>):<br>                cursor.setPosition(index)<br>                cursor.movePosition(QtGui.<wbr>QTextCursor.WordLeft, QtGui.QTextCursor.KeepAnchor)<br>                cursor.mergeCharFormat(format)<br>                pos = index + regex.matchedLength()<br>                index = regex.indexIn(<span style="color:rgb(148,85,141)">self</span>.<wbr>SearchResults.toPlainText(), pos)<br>                <span style="color:rgb(0,0,128);font-weight:bold">if </span>regex.isValid():<br>                    tedad += <span style="color:rgb(0,0,255)">1<br></span><span style="color:rgb(0,0,255)">            </span><span style="color:rgb(128,128,128)">nmayesh </span>= (<span style="color:rgb(0,128,128);font-weight:bold">"{}"</span>.format(tedad))<br>            <span style="color:rgb(148,85,141)">self</span>.SearchResults.append(<span style="color:rgb(0,128,128);font-weight:bold">"{}"</span><wbr>.format(tedad))<br><br>    <span style="color:rgb(0,0,128);font-weight:bold">def </span>retranslateUi(<span style="color:rgb(148,85,141)">self</span>, <span style="color:rgb(128,128,128)">Dialog</span>):<br>        _translate = QtCore.QCoreApplication.<wbr>translate<br>        <span style="color:rgb(148,85,141)">self</span>.setWindowTitle(_<wbr>translate(<span style="color:rgb(0,128,128);font-weight:bold">"Dialog"</span>, <span style="color:rgb(0,128,128);font-weight:bold">"Dialog"</span>))<br>        <span style="color:rgb(148,85,141)">self</span>.pushButton.setText(_<wbr>translate(<span style="color:rgb(0,128,128);font-weight:bold">"Dialog"</span>, <span style="color:rgb(0,128,128);font-weight:bold">"PushButton"</span>))<br>        <span style="color:rgb(148,85,141)">self</span>.pushButton.clicked.<wbr>connect(<span style="color:rgb(148,85,141)">self</span>.find1)<br><br>app = QApplication(sys.argv)<br>w = AppWindow()<br>w.show()<br>sys.exit(app.exec_())<br></pre></div></div></div></div></div></div></div></div></div></div></div></div></div></div>
<br>______________________________<wbr>_________________<br>
PyQt mailing list    <a href="mailto:PyQt@riverbankcomputing.com" target="_blank">PyQt@riverbankcomputing.com</a><br>
<a href="https://www.riverbankcomputing.com/mailman/listinfo/pyqt" rel="noreferrer" target="_blank">https://www.<wbr>riverbankcomputing.com/<wbr>mailman/listinfo/pyqt</a><br></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="m_9072950960043576933gmail-m_-2942892887450796706m_5257909204618472470m_-3820615639630079966gmail_signature">È difficile avere una convinzione precisa quando si parla delle ragioni del cuore. - "Sostiene Pereira", Antonio Tabucchi<br><a href="http://www.jidesk.net" target="_blank">http://www.jidesk.net</a></div>
</div></div>
</blockquote></div></div></div></div></div></div>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature">È difficile avere una convinzione precisa quando si parla delle ragioni del cuore. - "Sostiene Pereira", Antonio Tabucchi<br><a href="http://www.jidesk.net" target="_blank">http://www.jidesk.net</a></div>
</div>