2017-10-06 11 views
0

JavaScriptでSelenium RCインターフェイスで書かれた古いユニットテストスクリプトがたくさんあります。 Selenium 3にアップグレードしているので、私はPythonスクリプトを使って自動化された方法でいくつかのRCメソッドを取り除こうとします。私は、これらのスクリプトを1行ずつ繰り返して、Seleneseメソッドを取り出し、それらを解体してWebDriverインターフェイスで再構築しようとしています。例えば:私は空白を格納し、パラメータから分離方法、自動のSelenese方法を識別するためのシステムを持っているので、私は何Pythonの正規表現での二重引用符と一重引用符の間のテキストを取得

driver.findElement(By.xpath("//*[text()='test, xpath']")).sendKeys("test, text"); 

...として

selenium.type("xpath=//*[text()='test, xpath']", "test, text"); 

が出力されることだろう左には次の文字列があります:

("xpath=//*[text()='test, xpath']", "test, text") 

私はこの問題が常に一貫しているとは限りません。時にはそこに単一引用符でネストされた二重引用符、またはその逆であり、または例えば、二重引用符でネストされた二重引用符などをエスケープ:

("xpath=//*[text()=\"test, xpath\"]", "test, text") 
('xpath=//*[text()=\'test, xpath\']', 'test, text') 
('xpath=//*[text()="test, xpath"]', 'test, text') 

これらはすべて有効です。二重引用符が使用されているのか、一重引用符であるのかにかかわらず、メソッドに渡された引数と常に一致することができます。また、エスケープされた引用符だけでなく文字列を開くのと反対のネストされた引用符も無視してリストとして返します。

['xpath=//*[text()="test, xpath"]', 'test, text'] 

...など。私は次の式を使ってre.findallを使用しようとしました。

([\"'])(?:(?=(\\?))\2.)*?\1 

私が戻ってきたのはこれです。

>>> print arguments 
[('"', ''), ('"', '')] 

紛失しているものがありますか?

+0

に正規表現フィドルを確認することができます

RegEx Test

の95%+の場合に動作します引用符で囲まれた文字列: ''(([^ '\\] *(\\。)?)*)' | "(("^"\\)*(\\。)?)*)" ' –

答えて

0

私はlookbehindまたはlookaheadを使ってこの複合体を作っていません。むしろ、ケース固有の正規表現を構築します。あなたのケースでは、あなたが追加エスケープしている可能性が

これらのparamsインサイド

( "PARAM1"、 "PARAM2")

( 'PARAM1'、 'PARAM2')

以下のようなものを持っています引用符やシングルクォート、またはそうでないもの。 ", "または', 'を使用して、それを分割している一つのこと、見ている場合でも、これらの正確なパターンはめったにので、最も単純な非正規表現ソリューションは", "または', 'に基づいて分割することであろうPARAM1およびPARAM2

に発生しません。しかし、そこの余分なスペースや隙間なくなるので、我々は最初のパラメータに

("\s*,\s*"|'\s*,\s*')と一致する最初のブラケットと任意の開始引用

(?<first_param>.*?)に一致するように

^\(\s*["']\s*(?<first_param>.*?)("\s*,\s*"|'\s*,\s*')(?<second_param>.*?)\s*["']\s*\)$ 

\(\s*["']\s*パターンを使用することができます私たちのスプリットコマンドパターンと一致

(?<second_param>.*?)は、第二のparamに合わせて

\s*["']\s*\)$と一致するようにします。

これは完璧ではないですが、あなたは二重のすべてのシングル/に一致するように、リンク以下

https://regex101.com/r/z9PytD/1/

関連する問題