PDA

View Full Version : مشکل در MatchCollection



minaalamshahi
دوشنبه 08 تیر 1394, 10:40 صبح
با سلام
میشه بهم بگید دستور پایین چه رشته هایی رو برای من پیدا می کنه.
در ضمن یک رشته دیگه دارم که میخوام براش همچین توالی بنویسم.
میشه بهم بگید چطور می تونم براش دنباله بنویسم؟
یه لینک آموزشی که برای نوشتنش بتونم ازش استفاده کنم
MatchCollection MC = Regex.Matches(Text, ">\\w+?\\|(\\w+?)\\|(.+?)\n+([ACGT\n]+)");

minaalamshahi
سه شنبه 09 تیر 1394, 16:40 عصر
میشه بهم برای نوشتن عبارات باقاعده بهم کمک کنید

CrafteR
سه شنبه 09 تیر 1394, 22:01 عصر
میشه بهم برای نوشتن عبارات باقاعده بهم کمک کنید


لطفا بیشتر توضیح بدین. دقیقا میخواید چیکار کنید؟
چند نمونه متن قرار بدین و توضیح بدین عبارت با قاعده برای چه قسمت هایی لازم دارین (چه قسمت هایی از متن باید انتخاب بشه)؟

minaalamshahi
چهارشنبه 10 تیر 1394, 00:17 صبح
ببینید ورودی من حالتهای مختلفی می تونه داشته باشه که
1- یه قسمت داده که معمولا عدد هست یا تلفیق عدد و حروف id رکورد داده هست و من رنگی کردم اونها رو-اطلاعات بین سه | | | تای اولی را بردارید که معمولا کد و اسم ژنها ر-(چندین رکورد در یک فایل تکرار میشه) که اصولا با یه کاراکتر جدا کننده مثلا | جدا میشه
2- یه قسمتش یه سری متن انگلیسیه که اون توضیحاته
و3- یه قسمت که تکرار 4 حرف acgt هستش ،اصل داده منه
اما همون جور که گفتم چند نوع فرمت مختلف داره که میخوام نوشتنشون رو یاد بگیرم
مثلا یکیش همون فایلی هست که بالا گذاشتم
یکی دیگه اش

>gi|208436385|gb|FJ217161.1| Bundibugyo ebolavirus, complete genome
CGGACACACAAAAAGAATG


>A/California/VRDL92/2009|CY063107|4|HA|A|H1N1|10/17/2009|09_10|USA|Human|Y|AdmantaneResistance_Yes|Ose ltamivirResistance_No|IncreasedVirulence_No|Enhanc edTransmission_Yes|T92E_No|No
ATGAAGGCAATACTAGTAGTTC
داخل هر فایل هم چند تا از اینها میتونه باشه که وقتی به علامت < رسید یعنی یه رکورد دیگه شروع شده
>CY080801
ATGAAAGTAAAACTACTGGTCCTGTTA


انواع دیگه ای هم داره، که من باید همشون رو پیش بینی کنم
اگه میشه بهم یاد بدید چطوری باید بنویسمشون
خیلی ممنون که به سوالم توجه کردید

CrafteR
چهارشنبه 10 تیر 1394, 11:58 صبح
از توضیحات شما اینجور فهمیدم که شما قصد دارین اون قسمت های قرمز رنگ انتخاب کنید (که خودتون گفتین آیدی هستند). برای انتخاب این قسمت از متن علاوه بر این که باید با اصول عبارات با قاعده آشنا باشید باید با مفهوم گروه بندی هم آشنا باشید.

سعی میکنم در جواب سوال شما یه توضیح کوتاه راجع بشون بدم.
اول بگم که جواب سوال شما این کد زیر هستش که دو تا عبارت بالایی که تو پستتون بود به عنوان ورودی دادمش.
عبارت سوم ندادم چون گفته بودین آیدی باید حرف باشه یا عدد ولی سومی اینطور نبود. با این حال با توضیحاتی که می دم میتونید هر الگویی خواستید خودتون بسازید:

Regex rx = new Regex (@">(?:\w|\d|_|\/)+\|((?:\w|\d)+)\|"); string text = @">gi|208436385|gb|FJ217161.1| Bundibugyo ebolavirus, complete genomeCGGACACACAAAAAGAATG>A/California/VRDL92/2009|CY063107|4|HA|A|H1N1|10/17/2009|09_10|USA|Human|Y|AdmantaneResistance_Yes|Ose ltamivirResistance_No|IncreasedVirulence_No|Enhanc edTransmission_Yes|T92E_No|NoATGAAGGCAATACTAGTAGTT C";
foreach (Match m in rx.Matches(text))
{
Console.WriteLine (m.Groups [1].Value);
}

که خروجی اون به این شکله:

132805

حالا چطوری این عبارت با قاعده نوشته شده؟
اول بگم که شما برای بدست آوردن این عبارت میتونید از سایت Regexr (http://www.regexr.com/)استفاده کنید که کارتون خیلی راحت میکنه.
چند تا علامتی که من استفاده کردم کوتاه توضیح میدم. ضمنا تو همین سایتی Regexr تمامی این توضیحات کامل تر و با مثال هست. از منوی سمت چپ سایت قسمت Reference انتخاب کنید میبینید که خیلی توضیحات کامل تری قرار داده شده.



توضیح
عبارت


مشخص کننده حرف.
\w


مشخص کننده عدد.
\d


مشخص کننده کاراکتر "/"
\/


مشخص کننده کاراکتر "|"
\|


مشخص کننده تعداد یکی یا بیشتر برای عبارت قبل از خودش هست.
+


شرط OR که بین عبارت قبل و بعد از آن قرار میگیره
|


برای گروه بندی استفاده میشه و عبارت داخل اون یک گروه هست.
()


هر کاراکتری غیر از عبارات قاعده دار به منزله خود اون کاراکتر هست.
کاراکتر



با استفاده از این چند تا عبارت ساده میتونیم قسمتی از متن مورد نظر شما انتخاب کنیم. به مثال زیر توجه کنید:



نتیجه
عبارت


مشخص کننده عباراتی که شامل حرف و عدد و کاراکتر "_" و کاراکتر "/" باشه.
(\w | \d | _ | \/) +


عباراتی که با کاراکتر "|" شروع بشه و پایان پیدا کنه و بین این دو کاراکتر عبارتی شامل حرف و عدد باشه.
\| (\w | \d)+ \|



نتیجه ترکیب دو عبارت بالایی و اضافه کردن کاراکتر "<" به اول اون، میشه از اول هر رکورد تا آخرین کاراکتر آیدی انتخاب کرد:
>(\w|\d|_|\/)+\|(\w|\d)+\|

لینک نتیجه این الگو (http://regexr.com/3babc)



ولی همین طوری که در سوال شما مطرح شد، فقط قسمت آیدی لازم هستش و اول رکورد بی استفاده است.
که برای حل این مشکل از گروه بندی ها استفاده میشه.
همینطور که قبلا هم گفتم از پرانتز ها برای گروه بندی استفاده میشه و دسترسی به این گروه ها به صورت ترتیبی هست.
به عنوان مثال در عبارت بالایی سه تا گروه داریم یکی کل عبارت هست، دوم پرانتز اول "(\w|\d|_|\/)" و سومین گروه پرانتز دوم هست "(\w|\d)"
یه نکته اینجا هست که باید توجه کنید، این که اگه چند تا پرانتز داخل هم داشتیم اول پرانتز کلی، گروه حساب میشه و بعدش پرانتز های داخلی.
برای بدست آوردن نتیجه نهایی کافیه یک گروه بندی مناسب داشته باشیم که میتونید تو عبارت زیر ببینید:
>(\w|\d|_|\/)+\|((\w|\d)+)\|
در این عبارت گروه اول، پرانتز اول هست که کاراکتر آخر قبل از آیدی برمیگردونه.
گروه دوم آیدی مورد نظر ما هست که این عبارت هست :
((\w|\d)+)
و گروه سوم مشخص کننده آخرین کاراکتر آیدی هست که پرانتز داخل پرانتز قبلی مشخص کننده اون هستش.

تا اینجا میتونیم به آیدی که مد نظر شماست دسترسی پیدا کنیم که کدی که اول پست گذاشتم کاملا گویا هست.
ولی یه نکته که میتونیم از اون استفاده کنیم این هستش که ما میتونیم گروه هایی تعریف کنیم که تو شمارش گروه ها حساب نشند که با استفاده از این عبارت قابل انجام هست:
(?: )

این کار به ما کمک میکنه که شمارش گروه ها برامون خیلی راحت تر بشه.
البته تکنیک های دیگه برای گروه بندی وجود داره که توضیح اون ها از حوصله این پست خارج هستش ولی شما میتونید تو اینترنت سرچ کنید و توضیحات قابل توجهی پیدا کنید.

الگوی نهایی (http://regexr.com/3babl)

لینک هایی که دادم، عبارات پیدا شده به رنگ آبی نشون میده که با نگه داشتن موس روی اون ها شماره گروه ها و عبارات انتخاب شده در اون گروه نمایش میده.

اگه سوالی در این مورد داشتین در خدمتم.

CrafteR
چهارشنبه 10 تیر 1394, 12:56 عصر
ببینید ورودی من حالتهای مختلفی می تونه داشته باشه که
1- یه قسمت داده که معمولا عدد هست یا تلفیق عدد و حروف id رکورد داده هست و من رنگی کردم اونها رو-اطلاعات بین سه | | | تای اولی را بردارید که معمولا کد و اسم ژنها ر-(چندین رکورد در یک فایل تکرار میشه) که اصولا با یه کاراکتر جدا کننده مثلا | جدا میشه
2- یه قسمتش یه سری متن انگلیسیه که اون توضیحاته
و3- یه قسمت که تکرار 4 حرف acgt هستش ،اصل داده منه
اما همون جور که گفتم چند نوع فرمت مختلف داره که میخوام نوشتنشون رو یاد بگیرم
مثلا یکیش همون فایلی هست که بالا گذاشتم
یکی دیگه اش

>gi|208436385|gb|FJ217161.1| Bundibugyo ebolavirus, complete genome
CGGACACACAAAAAGAATG


>A/California/VRDL92/2009|CY063107|4|HA|A|H1N1|10/17/2009|09_10|USA|Human|Y|AdmantaneResistance_Yes|Ose ltamivirResistance_No|IncreasedVirulence_No|Enhanc edTransmission_Yes|T92E_No|No
ATGAAGGCAATACTAGTAGTTC
داخل هر فایل هم چند تا از اینها میتونه باشه که وقتی به علامت < رسید یعنی یه رکورد دیگه شروع شده
>CY080801
ATGAAAGTAAAACTACTGGTCCTGTTA


انواع دیگه ای هم داره، که من باید همشون رو پیش بینی کنم
اگه میشه بهم یاد بدید چطوری باید بنویسمشون
خیلی ممنون که به سوالم توجه کردید


شما پستتون ویرایش کردین!!!!
جوابی که به شما دادم مال قبل از ویرایش بود!!!!!
در کل بگم که این متنی که شما انتخاب کردین هیچ قانون خاصی نداره یا حداقل من نمیتونم قانونش بفهمم.
شما اول باید یه قانون کلی برای انتخاب متنتون پیدا کنید و بعد به دنبال یک عبارت با قاعده باشید.
از توضیحات پست قبلی من میتونید استفاده کنید و کل یک رکورد انتخاب کنید و در رکورد انتخاب شده به دنبال آیدی مورد نظر باشد ولی همین طور که گفتم باید یک قاعده ای برای این کار وجود داشته باشه.

minaalamshahi
یک شنبه 14 تیر 1394, 11:09 صبح
ا

ولی یه نکته که میتونیم از اون استفاده کنیم این هستش که ما میتونیم گروه هایی تعریف کنیم که تو شمارش گروه ها حساب نشند که با استفاده از این عبارت قابل انجام هست:
(?: )

این کار به ما کمک میکنه که شمارش گروه ها برامون خیلی راحت تر بشه.
ا
.
اول ممنون که وقت گذاشتید
بله پستم رو ویرایش کردم
اگر امکانش هست این قسمت رو بیشتر برام توضیح بدید

CrafteR
یک شنبه 14 تیر 1394, 15:05 عصر
اول ممنون که وقت گذاشتید
بله پستم رو ویرایش کردم
اگر امکانش هست این قسمت رو بیشتر برام توضیح بدید

به عنوان مثال به جواب سوال شما که تو اول پست قرار دادم توجه کنید:
>(?:\w|\d|_|\/)+\|((?:\w|\d)+)\|
گروه های ایجاد شده به این ترتیب خوانده میشند:
1- گروه اول: کل عبارت.
2- گروه دوم: عبارت زیر مشخص میکنه ولی چون با علامت (?: ) نوشته شده شمارش نمیشه:
(?:\w|\d|_|\/)
3- گروه سوم: عبارت زیر مشخص میکنه ولی چون گروه قبلی شمارش نشد، گروه دوم محسوب میشه:
((?:\w|\d)+)
4- گروه چهارم: داخل گروه قبلی قرار داره و مثل گروه دوم شمارش نمیشه:
(?:\w|\d)

بنابراین ما فقط یه یک گروه دسترسی داریم و اون گروه سوم هست با شماره ایندکس 1 (شماره ایندکس ها از صفر شروع میشه، و همینطوری که گفتم گروه سوم، دومی محسوب میشه)

اگه سوال دیگه داشتید در خدمتم

minaalamshahi
یک شنبه 14 تیر 1394, 15:37 عصر
شرمنده امکانش هست این خط رو برام تفسیر کنید؟
>\\w+?\\|(\\w+?)\\|(.+?)\n
مخصوصا قسمت
\n
.+?
\\
w+?

؟ اینجا همون معنی عدم شمارش که نداره؟

یه سوال دیگه اینکه من این دستور


>\\w+?\\|(\\w+?)\\|(.+?)\n+([ACGT\n]+)


رو که داخل سایتی که گفته بودین گذاشتم توی اونجا بهم میده مثلا 2 تا matches .اما دخل برنامه که میزارم به قول شما روی یکی از فایلها جواب نمیده.پس چرا تو سایت بهم تعداد match ها رو نشون میده؟

CrafteR
یک شنبه 14 تیر 1394, 16:34 عصر
علامت عدم شمارش گروه، پرانتز داره و یک دو نقطه هم جلوی اونه.
اینجا علامت سوال بعد از علامت + استفاده شده و معنی اون این هست که عبارت قبلی در حد ممکن از کاراکتر های کمتری تشکیل شده باشه.

این عبارت کل یک خط انتخاب میکنه، کسی براتون نوشته؟
فک کنم چند جاش مشکل داشته باشه

minaalamshahi
یک شنبه 14 تیر 1394, 19:02 عصر
یه سوالی که واقعا برام هست اینه که داخل سایت http://www.regexr.com/
من همین عبارتی که خودم داشتم استفاده می کنم تمام حالات رو
تمام خطوط انتخاب شده و زده 1match ؟؟
اما دستور شما هم تست کردم روی دوتاش جواب میده یکیش نه.
خوب این یعنی که صدق می کنه ولی تو برنامه جواب نمیده
بله این عبارت رو قبل از این پست کسی برام نوشته بود ولی فقط روی حالت پایین بهم جواب نمیده
بقیه حالات رو ساپورت میکنه
اخه من غیر از آی دی ،قسمت دیتا رو هم میخوام.ولی ای دی رو توی یک گروه و دیتا رو توی گروه دیگه.
پس \n کل خط رو بهمون میده؟یعنی >\\w+?\\|(\\w+?)\\|(.+?)\n+([ACGT\n]+)
acgt رو بخون تا زمانیکه تموم بشه؟

>CY080801

ATGAAAGTAAAACTACTGGTCCTGTTATGCACATTTACAGCTA

dot(.) ، چه معنی داره؟
شرمنده ولی این جمله رو متوجه نمیشم؟

اینجا علامت سوال بعد از علامت + استفاده شده و معنی اون این هست که عبارت قبلی در حد ممکن از کاراکتر های کمتری تشکیل شده باشه.
عذر میخوام یه مشکلی رو یه نمونه ای مثل نمونه زیر هم دارم که تعداد کاراکتر | نامشخص هست ولی من قسمت رنگی شده رو لازم دارم
ولی اصولی که داره میگن بین سه تا | اول یا همون اولی رو باید در نظر بگیرم.و بقیه رو کامنت در نطر بگیرم

>A/California/VRDL92/2009|CY063107|4|HA|A|H1N1|10/17/2009|09_10|USA|Human|Y|AdmantaneResistance_Yes|Ose ltamivirResistance_No|IncreasedVirulence_No|Enhanc edTransmission_Yes|T92E_No|No

ATGAAGGCAATACTAG
البته بگم داخل سایت درست تشخیص میده ها
توی برنامه جواب نمیده